본문 바로가기

프로그래밍/Java

예외 처리

컴파일러는 컴파일을 할 때

일반 예외가 발생할 가능성이 있는 코드를 발견하면

에러를 발생시켜 개발자가 강제적으로

예외 처리 코드를 작성하도록 요구

 

 

예외 처리 코드

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");
    }
}

 

'프로그래밍 > Java' 카테고리의 다른 글

멀티 스레드  (0) 2019.12.10
Java api  (0) 2019.12.10
예외 클래스  (0) 2019.12.07
익명객체  (0) 2019.12.06
중첩 클래스와 중첩 인터페이스  (0) 2019.12.05