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) {
// 예외 처리
}
'Backend > Java' 카테고리의 다른 글
[Java] 자바 예외 넘기기 (throws) (0) | 2021.12.27 |
---|---|
[Java] 자바 try-with-resource (AutoCloseable) (0) | 2021.12.26 |
[Java] DTO List 정렬 방법 (Comparator API) (0) | 2021.12.22 |
[Java] 데이터 정렬 Null 처리 (nullsFirst(), nullsLast()) (0) | 2021.12.20 |
[Java] 자바 8 Iterable API (forEach, spliterator) (0) | 2021.12.19 |