1) 직접 처리 - try ~ catch, finally
catch 또는 finally 블럭은 반드시 try와 함께 사용
try{
//발생가능성이 있는 코드 작성;
//1)
//2)
//3)
//4)
}catch(XxxException e){
//예외 발생 시 해야하는 일
}...finally{
}
➕ finally
예외 발생 여부와 상관 없이 무조건 실행해야하는 일 작성 (catch구문 없이 try~finally 사용 가능)
❓ 예외가 여러개 일경우
👉 catch 구문을 여러개 작성할 수 있다.
catch 구문 여러개 작성 시 반드시 서브클래스 부터 작성해야한다(다형성 성립)
try{
}catch (ArrayIndexOutOfBoundsException e) {
}catch (NumberFormatException e) {
}catch(Exception e){
}
Exception e 로 표기 하면서 한번에 모든 예외를 처리를 할 수 있으나 각 예외 상황별로 직접 처리하는 것이 더 좋다
2) 던지기(위임) - throws
메소드를 호출한 주체에게 예외를 throws(던지기) 하여 선언부에서 강제로 예외 발생 처리하는 것
throws 발생할 예외 객체;
❓예외처리를 throws(위임)하는 이유
1. 하나의 기능이 동작할 때 각 상황에 따른 예외를 하나의 영역에서 한번에 처리하기 위해
2. 메소드를 호출하는 주체가 예외처리를 직접할 수 있도록 정보를 제공하기 위해
➕ SQLException
SQL 사용시 발생하는 예외에 대한 정보가 매우 상세하다.
이렇게 된다면 사용자에게는 불필요한 많은 정보를 전달하고 해커에게는 많은 데이터 노출로 보안성 문제 발생 가능성이 높아진다.
이럴때, 내부적 예외 발생시 우회 시키기 위해 throws 를 이용하여 강제 예외 발생 시킨다.
3) 사용자 정의 Exception
이름이 있는 예외들은 모두 상황이 정해져있는 예외들이다.
❓만약 내가 나만의 예외를 만들고싶다면? 👉 사용자 정의 Exception class 만들면 가능
//체크 예외(무조건 처리)
class XxxException extends Exception{
XxxException(){ //constructor 생성
super("기본 메세지 작성");
}
XxxException(String message){
super(message);
}
}
//비체크 예외(선택 처리)
class XxxException extends RuntimeException{
}
throw new XxxException();
new XxxException("사용자 정의 Exception 예시 코드");