[Java] 예외 처리하기(try-catch)

nathan·2022년 1월 25일
0

JAVA

목록 보기
33/45

예외 처리하기(try-catch)

try{
   // 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception e1) {
   // Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다.
} catch (Exception e2) {
   // Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다.
} catch (Exception eN) {
   // Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다.
}
  • catch 블럭은 여러개 올 수 있다.(발생할 수 있는 예외가 여러 개 있을 수 있다는 말)
  • if문과 달리, try 불럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 괄호{}를 생략할 수 없다.(괄호 생략 불가.)

try-catch문의 흐름

  • 1) try 블럭 내에서 예외가 발생한 경우,
    • (1) 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
    • (2) 일치하는 catch 블럭을 찾게 되면, 그 catch 블럭 내의 문장들을 수행하고, 전체 try-catch 문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 블럭을 찾지 못하면, 예외는 처리되지 못한다.
  • 2) try 블럭 내에서 예외가 발생하지 않은 경우,
    • (1) catch 블럭을 거치지 않고, 전체 try-catch 문을 빠져나가서 수행을 계속한다.

printStackTrace()와 getMessage()

  • 예외가 발생하면 예외 객체가 생성이 되고, 그 안에 printStackTrace()getMessage()등을 가지고 있다.

printStackTrace()

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

getMessage()

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

  • 예외 객체에는 다음과 같이 다양한 메서드들이 존재한다.

멀티 catch블럭

  • 내용이 같은 catch 블럭을 하나로 합친 것 (JDK 1.7부터)
  • 중복을 제거할 수 있다.

example

try{
   // ...
} catch (ExceptionA | ExceptionB e) {
   e.printStackTrace();
}

유의사항

  • catch 블럭에 들어갈 예외 클래스가 서로 부모-자식 관계면 안된다.(부모로 포함할 수 있기 때문)
try{
   // ...
// } catch (ParentException | ChildException e) { // error!
} catch (ParentException e) { // OK. 위의 라인과 의미상 동일하다.
   e.printStackTrace();
}
  • 한 예외 클래스에만 존재하는 메서드를 호출하면 안된다. (분기문을 통해 작성해야 함)
    • 사실 아래와 같이 쓸바에는 catch 블록을 따로 구성하는게 더 바람직하다.
try{
   // ...
} catch (ExceptionA | ExceptionB e) {
   e.methodA(); // error (ExceptionA에 선언된 methodA()는 호출불가)
   
   if (e instanceof ExceptionA) {
      ExceptionA e1 = (ExceptionA)e;
      e1.methodA(); // OK. ExceptionA에 선언된 메서드 호출 가능
   } else { // if (e instanceof ExceptionB)
   // ...
   }
}
profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글