본문으로 바로가기

[Java] 자바 예외 처리(Exception, RuntimeException)

category Backend/Java 2021. 12. 25. 23:33

1. 에러와 예외

에러

  • 컴퓨터 프로그램의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러라고 합니다.
  • 에러는 JVM 실행에 문제가 생겼다는 것이므로 실행 불능이 됩니다.

 

예외

  • 자바에서는 에러 이외에 예외(Exception)이라고 부르는 오류
  • 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말합니다.
  • 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일합니다.
  • 에러와의 차이점으로는 예외는 예외 처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있습니다.

2. 예외의 종류

자바의 예외

  • 자바에서는 예외를 클래스로 관리합니다.
  • 모든 예외 클래스들은 java.lang.Exception 클래스를 상속받는다.
  • 컴파일 시 예외 처리를 확인하는 차이일 뿐, 두 가지 예외는 모두 예외 처리가 필요합니다.

 

1. 일반 예외(Exception)

  • 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문입니다.
  • 일반 예외는 Exception을 상속받지만 RuntimeException을 상속받지 않는 클래스
  • InterruptedException, IOException, ParseException 등이 존재합니다.

 

2. 실행 예외(Runtime Exception)

  • 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말합니다.
  • 실행 예외는 RuntimeException을 상속받은 클래스
  • RuntimeException 역시 Exception을 상속받지만,  JVM은 RuntimeException을 상속했는지 여부를 보고 실행 예외를 판단합니다.
  • JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성 후 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해줍니다.
  • 실행 예외는 자바 컴파일러가 체크를 하지 않기 때문에 오직 개발자의 경험에 의해서 예외 처리 코드를 작성해야 합니다.
  • NullPointerException, ArrayIndexOutOfBoundsException, NumberFormatException, ClassCastException 등이 존재합니다.

3. 예외 처리 코드

  • 프로그램에서 예외가 발생했을 경우 프로그램의 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 합니다.
  • try-catch-finally 블록을 이용합니다.
  • try-catch-finally 블록은 생성자 내부와 메소드 내부에서 작성되어 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.

4. try-catch-finally

try 블록

  • 예외 발생 가능성이 있는 코드를 작성합니다.
  • 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고  finally 블록의 코드를 실행합니다.
  • 예외 발생 시 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행하고 finally 블록의 코드를 실행합니다.

 

catch 블록

  • 예외 발생 시 예외 처리 코드를 작성합니다.

 

finally 블록

  • 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록을 작성하면 됩니다. (생략 가능)
  • try 블록과 catch 블록에서 return문을 사용하더라도 finally 블록은 항상 실행됩니다.

5. try-catch-finally 변형

다중 catch

  • catch 블록이 여러 개 일지라도  단 하나의 catch 블록만 실행됩니다.
  • try 블록에서 동시 단발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문입니다.
  • 하위 예외는 상위 예외를 상속하므로 상위 예외 타입에 속합니다. 따라서 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 합니다.
try {
    
    // ClassCastException 발생 가능성 코드
    // IllegalStateException 발생 가능성 코드
    // IndexOutOfBoundsException 발생 가능성 코드
    
} catch (ClassCastException e) {
    // 예외 처리 1
} catch (IllegalStateException e) {
    // 예외 처리 2
} catch (IndexOutOfBoundsException e) {
    // 예외 처리 3
}
[Exception Class 순서 주의 (에러)]

try {
    // 예외 발생 가능성 코드
} catch (Exception e) {
    // 예외 처리 1
} catch (IllegalStateException e) { // IllegalStateException은 Exception을 상속 (에러)
    // 예외 처리 2
}

 

멀티 catch

  • 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있도록 멀티 catch 기능을 제공합니다. (자바 7 이상)
  • 동일하게 처리하고자 하는 예외를 | 를 사용해서 연결하면 됩니다.
try {

    // ClassCastException 발생 가능성 코드
    // IllegalStateException 발생 가능성 코드
    // IndexOutOfBoundsException 발생 가능성 코드
    
} catch (ClassCastException | IllegalStateException | IndexOutOfBoundsException e) {
    // 예외 처리
}