Java

[JAVA 자바] 예외처리 try catch finally

ChanPumpkin 2022. 9. 19. 21:39

try문

  • 예외 발생할 가능성이 있는 코드 문장을 try문 안에 넣는다.
  • try 블록 내에서 예외가 발생하면 해당 예외가 연결된 예외 처리기에 의해 처리가 된다.
  • 예외 처리기를 try문과 연결하려면, try문 뒤에 catch문을 작성해줘야 함.
try {
    //code
}
//catch and finally blocks . . .

catch문

  • try문 바로 뒤에 하나 이상의 catch문을 제공하여 예외 처리기를 try문과 연결할 수 있다.
  • 어떠한 코드도 try문의 끝과 첫 번째 catch문의 시작 사이에 있을 수 없다.
  • 처리기가 처리할 수 있는 예외 유형을 선언하며, Throwable클래스로부터 상속하는 클래스의 이름이어야 함.
  • 예외 처리기는 오류 메시지를 인쇄하거나 프로그램을 중지하는 것 이상의 작업을 수행할 수 있습니다.
try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

예시

try {

} catch (IndexOutOfBoundsException e) {
    System.err.println("IndexOutOfBoundsException: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

printStackTrace(), getMessage()

printStackTrace()

예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.

getMessage()

발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음.

멀티 catch 블럭

JAVA SE 7이상에서 하나의 catch문이 둘 이상의 예외 유형을 처리할 수 있다.

  • vertical bar | 로 각 예외 유형을 구분함.
  • vertical bar | 로 연결할 수 있는 예외 클래스의 개수에는 제한이 없다.
catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

멀티 catch 블럭 주의사항

멀티 catch블럭 | 을 예외 클래스가 조상과 자손의 관계가 있는 예외를 연결하면 컴파일 예러가 발생함.

두 예외 클래스가 조상과 자손의 관계라면, 조상 클래스만 써주는 것이 맞다.

try{
	...
} catch(ParentException | childException e) { //에러 발생
	...
}

finally 블럭

try 또는 catch 문이 실행되는 동안 JVM이 종료되면, finally문은 실행되지 않을 수 있다.
출처 : oracle 공식문서

  • 항상 try문이 종료될 때 실행됨.
  • 예외가 발생한 경우 try→catch→finally 순으로 실행됨.
  • 예외가 발생하지 않은 경우 try→finally의 순으로 실행됨.

try->finally

예외가 발생하지 않아서, catch를 지나지 않아서 바로 finally로 간다.

public class testExceptionClass {
    public static void main(String[] args) {
        try {
            System.out.println("Try");
        } catch(Exception e) {
            System.out.println("Catch");
        } finally {
            System.out.println("Finally");
        }
    }
}

try->catch->finally

try문안에서 throw new Exception(); 로 강제로 예외를 발생시켰기 때문에, catch문에 갔다가 finally로 간다.

public class testExceptionClass {
    public static void main(String[] args) {
        try {
            System.out.println("Try");
            throw new Exception();
        } catch(Exception e) {
            System.out.println("Catch");
        } finally {
            System.out.println("Finally");
        }
    }
}

참고