컴파일러는 컴파일을 할 때
일반 예외가 발생할 가능성이 있는 코드를 발견하면
에러를 발생시켜 개발자가 강제적으로
예외 처리 코드를 작성하도록 요구
예외 처리 코드
try-catch-finally블록
생성자 내부와 메소드 내부에서 작성
일반 예외와 실행 예외가 발생할 경우 예외 처리
try{
//예외 발생 가능 코드
}
catch(/*예외클래스 e*/){
//예외 처리
//예외가 발생하지 않으면 finally블럭 실행
//예외가 발생하면 예외 처리 후 finally블럭 실행
}
finally{
//항상 실행
//finally블럭은 작성 안해주어도 무관
}
finally블럭은 무조건 실행이라
try나 catch블럭에서 return문을 사용해도 실행된다
예제)
Class.forName()메소드는 매개값으로 주어진 클래스가 존재한다면
Class 객체를 리턴하지만 존재하지 않으면
ClassNotFoundException 발생(일반 예외)
public class TryCatchFinally{
public static void main(String[] args){
try{
Class clazz = Class.forName("java.lang.String2");
}
catch(ClassNotFoundException e){
System.out.println("클래스가 존재하지 않습니다.");
}
}
}
예외가 발생하여 catch블럭이 동작
예외 종류에 따른 처리 코드
다중 catch문
try{
//ArrayIndexOutOfBoundsException 발생
//예외 처리1로 이동
//NuberFormatException 발생
//예외 처리2로 이동
}
catch(ArrayIndexOutOfBoundsException e){
//예외 처리1
}
catch(NumberFormatException e){
//예외 처리2
}
다중 catch문 주의할 점
상위 예외 클래스가
하위 예외 클래스보다 아래쪽에 위치해야 함
잘못된 예
try{
//ArrayIndexOutOfBoundsException발생
//NumberFormatException발생
}
catch(Exception e){
//예외 처리1
}
catch(ArrayIndexOutOfBoundsException e){
//예외 처리2
}
이 코드에서는 예외 처리2는 어떤 경우라도 실행되지 않음
ArrayIndexOutOfBoundsException과 NumberFormatException은 모두
Exception의 하위 클래스이기 때문에
수정한 올바른 코드
try{
//ArrayIndexOutOfBoundsException발생
//NumberFormatException발생
}
catch(ArrayIndexOutOfBoundsException e){
//예외 처리1
}
catch(Exception e){
//예외 처리2
}
예외 떠넘기기
throws
throws키워드가 달린 메소드는
메소드에서 처리하지 않은 예외를
호출한 곳으로 떠넘기는 역할
throws 키워드 뒤에는
떠넘길 예외 클래스를 쉼표로 구분해서 나열
리턴타입 메소드이름(매개변수,...) throws 예외클래스1, 예외클래스2,...{
}
예외클래스를 Exception으로해서 모든 예외를 떠넘기는 것도 가능
리턴타입 메소드이름(매개변수,...) throws Exception{
}
throws 키워드가 붙어 있는 메소드는
반드시 try블럭 내에서 호출
이유는 아까 말했다시피
throws키워드가 달린 메소드는
메소드에서 처리하지 않은 예외를
호출한 곳으로 떠넘기는 역할이여서
try블럭 내에서 호출하여 예외가 발생하면
catch로 넘겨줘야 하기 때문
public class TryCatchFinally{
public static void main(String[] args){
try{
method2();//여기서 호출했기 때문에 이 try-catch에서 예외처리
}
catch(ClassNotFoundException e){
//예외 처리 코드
System.out.println("클래스가 존재하지 않습니다.");
}
//method2(); ERROR
}
static void method2() throws ClassNotFoundException{
Class clazz = Class.forName("java.lang.String2");
}
}