Exception이 터지든 말든~
에러가 나든 말든~
응 그냥 다음에 고칠게~ 에러 안 나게 할게~
하던 지난 날의 나를 반성하며... 적는 Exception 처리...
예외 처리(Exception Handling)
이란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이다!
자바의 코드를 예외처리를 한다고 해서, 프로그램의 예외 상황 자체를 막을 수는 없다. (사람들은 ㄹㅇ 이상한 걸 다 시도하고 어쩌고 개발자의 생각을 뛰어넘고)
예외 처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상적인 동작을 막고, 에러를 잡아 복구를 시도하거나 아니면 회피하는 식으로 처리를 해서, 프로그램이 정상적인 실행상태를 유지
할 수 있도록 하는 것이다!
try-catch 문의 기본 구조
try {
//로직
} cath (Exception e) {
//예외 처리
}
try 블럭 안에 예외가 발생할 수 있는 코드를 작성하고,
catch에 작성한 exception 종류에 맞는 곳으로 가서 catch 블럭 안에 있는 코드를 실행시킨다!
오류가 발생하지 않는다? 그러면 catch문을 실행하지 않아도 된다
catch 블럭 내에 오류가 발생했을 때 대비할 수 있는 코드를 작성해두어야 한다!
try {
//로직
} cath (Exception e) {
//예외 처리
} finally {
//무조건 수행
}
프로그램 수행 도중 예외가 발생하면 프로그램이 중지되거나 예외 처리에 의해서 catch문이 실행된다.
하지만, 예외가 발생하든 발생하지 않든 꼭 실행되어야 하는 부분이 있다면 finally
문으로 처리가 가능하다
예외가 발생하는 경우? try -> catch -> finally
예외가 발생하지 않는 경우? try -> finally
JDK 1.7부터 catch 블럭을 |
기호를 통해서 하나의 catch 블럭으로 합칠 수 있게 되었다
try {
//로직
} catch (NullPointException | ArrayIndexOutOfBoundsException e) {
if(e instanceOf NullPointException) {
//예외 처리
} else if(e instanceOf ArrayIndexOutOfBoundsException) {
//예외 처리
}
}
다만, 각 예외마다 세부사항은 if문과 instanceOf 연산자로 분기하며 처리해야 한다!
말 그대로 예외를 그냥 던지는 방법이다..!
나는 예외를 처리하지 않을 거니까, 나를 불러다 쓰는 놈한테 내 에러 처리를 전가하겠음!
이런 뜻이다 :)
나는 이걸 제대로 모르고 아무렇게나 코드를 짜다가... 그냥 여기저기서 터지는 에러에 눈물을 머금음
public static int divide(int a, int b) throws ArithmeticException {
if(b == 0) throw new ArthmeticException("0으로 나눌 수 없습니다.");
return a/b;
}
divide 메서드는 a와 b를 나눈 후 return 해주는 역할을 하는데, 여기서 b의 값이 0이라면 예외가 발생할 수 있다!
이것을 try - catch로 처리할 수도 있지만, throws 함으로써divide()를 호출한 곳에서 예외 처리를 해주기를 바라고 있다. 왜냐하면, divide()를 호출한 곳에서 예외가 발생한 후, 다음의 처리를 divide 메소드가 정하지 않았기 때문이다!
예를 들어 main 메소드에서는 예외가 발생하면 다시 divide()를 호출하거나, 프로그램을 끝내거나, b의 값을 다시 입력받거나 해야하기 때문이고, divide()메소드가 그 결정을 할 수 없다는 의미이다
예외를 던진 후 메인에서 처리하는 방법
int a = 10;
int b = 0;
try {
divide(a, b);
} catch (ArithmeticException e) {
//여기서 처리
e.getMessage(); //예외 메세지 출력
b = 1;
divide(a, b); //다른 값 대입해서 회피
}
예외를 발생시키는 키워드는 throw!
예외를 처리하기 위해서는 try-catch 블럭을 써야 함
catch 문의 Exception e
에서 Exception은 변수의 클래스타입이고 e는 변수이다.
그리고 이 객체 변수 안에는 에러 메세지를 출력하는 메서드가 있다.
printStackTrace()
: 예외 발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력getMessage()
: 발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있음더 많은 메서드가 있지만 주로 이 두 개를 사용한다고 한다 :)