예외는 런타임 오류가 발생한 것을 의미하며, 이러한 예외가 발생할 것을 예측하여 예외처리를 하는 게 가능하다.
Java에서는 예외 처리 하는 방식으로 전통적인 방식과 전용 방식이 있다.
전통적인 방식은 if else 문을 사용하며, 전용 방식으로는 try catch finally 문을 사용한다.
💡try catch finally
try {
} catch (Exception e) {
// TODO: handle exception
}
private static void tryCatch() {
int num = 10;
try {
// 비즈니스 영역
System.out.println(100 / num);
} catch (Exception e) {
// 예외 처리 영역
System.out.println("예외 처리");
} finally {
// 마무리 영역
System.out.println("파일 종료");
}
}
try catch문은 기본적으로 try 비즈니스 영역과 catch 예외 처리 영역으로 구분되며, finally 마무리 영역을 추가하여 구성할 수 있다.
finally 마무리 영역은 에러가 나던 안 나던 무조건 실행되며, 예외와 상관없이 항상 실행해야 하는 코드가 있을 경우 작성하나, 대체로 사용도가 떨어지는 편이다.
위 소스코드는 try 비즈니스 영역 를 실행한 뒤, finally 마무리 영역을 실행하고 종료한다. 만약 비즈니스 영역을 실행하던 중 오류가 나면 catch 예외 처리 영역을 실행한 뒤 마무리 영역이 실행된다.
💡다중 캐치문
private static void tryCatchs() {
try {
// 0으로 나누기 > ArithmeticException
int num = 10;
System.out.println(100 / num);
// 배열 첨자 > ArrayIndexOutOfBoundsException
int[] nums = new int[3];
nums[0] = 10;
// 널참조 > NullPointerException
Scanner scan = null;
scan.nextLine();
} catch (ArithmeticException e) {
System.out.println("0으로 나누기");
} catch (ArrayIndexOutOfBoundsException e)
System.out.println("배열 첨자");
} catch (NullPointerException e) {
System.out.println("널참조");
} catch (Exception e) {
System.out.println("예외 처리");
}
}
예측 가능한 에러들을 묶어 다중 캐치문을 작성할 수 있다.
각 부분에서 에러가 발생하는 경우, 발생하는 에러 메시지를 catch 절로 던져서 해당하는 게 있는지 확인한다.
이러한 과정은 공(에러 메시지)을 던지면 catch 절에서 잡는다고 이해하면 편하다.
catch 절의 마지막에는 Exception e는 미리 준비하지 못한 예외처리가 발생한 경우에 사용한다. 이를 if문으로 치면 else 절로 볼 수 있으며, 공이 마지막 사람에게 온 것을 의미한다.
Exception e는 자세한 예외처리는 못 하더라도 예상하지 못한 에러에 대한 두루뭉실한 예외처리가 가능하다. 또한 이 캐치절은 모든 에러를 잡기 때문에 위로 올라가서는 안 된다.
💡예외 던지기
private static void throwException() {
int num = 10;
try {
if (num % 2 == 1) {
throw new Exception(); // 예외 던지기
}
System.out.println("업무 진행..");
} catch (Exception e) {
System.out.println("예외 처리..");
System.out.println(e.getMessage());
}
}
숫자를 입력받아 처리하는데 반드시 짝수만 입력하게 하고, 홀수를 입력받을 경우 에러 처리를 한다고 하자.
throw new Exception();
이때 홀수일 경우 에러 던지기를 하여 예외처리가 가능하다. 예외 던지기 구문의 throw에는 s가 없으니 주의한다.
이 구문을 만나는 순간! 자바는 냅다 catch 절로 이동한다.
예외 던지기를 하면 프로그램 흐름을 변경하여 특정 조건에 따라 다른 코드 블록이 실행되도록 할 수 있다.
💡예외 미루기
private static void m5() throws Exception {
}
예외 미루기(throws Exception)를 하면 실행 중인 메서드에서 예외를 처리하지 않고 상위 호출자로 예외를 전달할 수 있다.
단, 예외 미루기는 main 메소드에서는 절대 하지 않도록 한다. main메소드마저 예외를 미뤄버리면 더이상 처리할 수 있는 부분이 없기 때문이다.
💡try catch Edit Template
Pattern 수정
System.out.println("at ${primary_type_name}.${enclosing_method}");
e.printStackTrace();
try 입력 > Ctrl + Space 단축키를 누르면 자동으로 try catch 구문이 만들어진다.
그러나 catch 구문을 만들기만 하고 아무 것도 작성하지 않는다면 에러가 발생하는데도 발생 원인을 모를 수 있다.
그러므로 Edit Template에서 Pattern을 수정해주면 자동으로 내용이 작성되므로 개발자는 에러가 발생했음을 인지할 수 있다.