Exception 클래스의 하위클래스 : NullPointerException, NumberFormatException 등이 있다.
NullPointerException : 객체를 가리키지 않고 레퍼런스를 이용할 때
ArrayIndexOutOfBoundException : 배열에서 존재하지 않는 인덱스를 가리킬 때
NumberFormatException : 숫자 데이터에 문자 데이터등을 넣었을 때
=> 암기할 필요없이 그냥 있는것만 알고 넘어가기
개발자가 예외처리하는 구문
형식
try{
예외가 발생할 수 있는 코드
} catch ( Exception e) {
예외가 발생했을 때 처리할 코드
}
try 에서 예외가 발생한 구문이 있다면, catch 에서 예외를 처리하고 try 에서 그 구문 밑으로는 더 이상 코드가 실행이 안되고 try-catch 구문을 벗어난다.
printStackTrace() : 어떤 예외가 발생했는지 출력
getMessage() : 예외를 간략하게 나타낸 문자열을 리턴
예제1
int i = 10;
int j = 0;
int r = 0;
try{
r = i / j;
} catch ( Exception e) {
e.printStackTrace(); //java.lang.ArithmeticExcpetion: / by Zero 출력
String msg = e.getMessage();
System.out.println("msg:" + msg); // msg: by Zero 출력
}
System.out.println("Excpetion After"); // try-catch 에서 예외가 발생해도
// 구문이 알아서 예외를 잡아주기 때문에 이 구문은 정상적으로 실행된다.
try-catch 구문에서
catch( ) 의 인자로 Exception 외에도 하위 클래스를 이용해서 예외처리를 할 수 있다.
catch 구문을 여러개 적어서, 여러 예외 처리를 동시에 할수도 있다.
try{
System.out.println("input i:");
i = scanner.nextInt();
System.out.println("input j:");
j = scanner.nextInt();
System.out.println("i/j =" + (i/j) );
for(int k=0; k<6; k++){
System.out.println("iArr[" + k + "]:" + iArr[k]);
}
System.out.println("list.size():" + list.size());
} catch(InputMismatchException e) {
e.printStackTrace();
System.out.println("첫번째 타입의 예외 발생!!");
} catch(ArrayIndexOutOfBoundException e){
e.printStackTrace();
System.out.println("두번째 타입의 예외 발생!");
} catch(Exception e){
e.printStackTrace();
System.out.println("그 외 타입의 예외 발생!!");
}
try-catch 에서 예외 발생 여부에 상관없이 항상 실행되는 구문
try-catch 에서 예외 처리가 모두 끝난 후 마지막에 실행되는 구문이다
형식
try{
~~
} catch {
~~
} finally {
항상 마지막에 실행되는 구문
}
try{
System.out.println("input i:");
i = scanner.nextInt();
System.out.println("input j:");
j = scanner.nextInt();
System.out.println("i/j =" + (i/j) );
for(int k=0; k<6; k++){
System.out.println("iArr[" + k + "]:" + iArr[k]);
}
System.out.println("list.size():" + list.size());
} catch(InputMismatchException e) { // Exception 의 하위 클래스
e.printStackTrace();
System.out.println("첫번째 타입의 예외 발생!!");
} catch(ArrayIndexOutOfBoundException e){ // Exception 의 하위 클래스
e.printStackTrace();
System.out.println("두번째 타입의 예외 발생!");
} catch(Exception e){
e.printStackTrace();
System.out.println("그 외 타입의 예외 발생!!");
} finally {
System.out.println("예외 발생 여부에 상관없이 항상 실행됩니다!");
}