try-catch 문에 Exception 처리 과정을 만들고 특정 메소드에서 throws Exception 처리를 하는 건 대부분의 자바 개발자 분들에게는 익숙한 광경입니다. 그런데 정작 예외 처리 방법은 알고 있으면서 에러나 예외의 개념에 대해서는 다소 두루뭉술하게 알고 있는 경우가 많습니다.
오늘은 에러와 예외의 개념을 좀 더 명확하게 짚어보고자 합니다.
에러(Error)
자바에서 에러란 자바 프로그램 밖에서 발생한 문제로 인해 응용프로그램 실행 오류가 발생하는 것을 의미합니다. OS에 문제가 발생해 응용 프로그램에 문제가 발생하는 경우가 이에 해당한다고 볼 수 있습니다. 에러는 아무리 프로그램을 견고하게 만든다 한들 개발자가 직접 대처할 수 있는 방법이 없습니다.
예외(Exception)
잘못된 사용 또는 잘못된 코딩으로 인한 오류를 말합니다. 예외가 발생하면 프로그램이 곧바로 종료된다는 점은 에러와 동일합니다. 하지만 예외는 예외처리를 통해 계속 실행 상태를 유지할 수 있다는 점에서 에러와 다릅니다.
- 자바에서 에러와 예외는 클래스로 관리되며 둘 다 Throwable 클래스를 상속받습니다.
- Throwable 클래스에는 다음과 같은 메소드가 정의되어 있습니다.
- public String getMessage() : 오류/예외의 원인을 담고 있는 문자열 반환
- public void printStackTrace() : 오류/예외가 발생한 위치와 호출된 메소드 정보 출력
예외의 종류
1) Checked Exception
- 컴파일러가 예외 처리 코드 여부를 검사하는 예외
- 예외 처리를 하지 않으면 컴파일이 진행되지 않습니다.
- 대표적으로 SQLException, ClassNotFoundException, IOException이 있습니다.
2) Unchecked Exception
- 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외
- 컴파일 후 런타임 시 발생할 수 있는 예외입니다.
- 대표적으로 NullPointerException, ArrayIndexOutOfBoundsException이 있습니다.
예외 처리 방법
1) 예외 복구 : 예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법
2) 예외 회피 : 예외 처리를 직접하지 않고 throws를 통해 호출한 쪽으로 던져 회피하는 방법
3) 예외 전환 : 예외 회피와 비슷하게 예외를 throws 하지만 그냥 던지지 않고 적절한 예외로 전환해서 넘기는 방법
Q&A
* main 메소드에 보면 항상 throws IOException 가 적용되어 있는데 여기에서 발생하는 예외는 어디에서 처리해주나요?
- Exception이 발생하면 해당 Exception은 Call Stack의 최상단까지 거슬러 올라가게 됩니다.
- 올라가다보면 Java의 최상단 메소드인 main() 메소드까지 올라가고 여기서도 잡히지 않으면 Exception은 결국 JVM 까지 거슬러올라갑니다.
- JVM은 Exception을 받게되면 console에 stack trace를 프린트한 후 non-zero exit code 로 프로그램을 종료(terminate)합니다.
'Java' 카테고리의 다른 글
BigDecimal (0) | 2024.05.20 |
---|---|
String과 String Constant Pool (0) | 2024.03.26 |
상수(Constant)와 리터럴(Literal) (0) | 2024.03.17 |
GC(Garbage Collection, Garbage Collector) (1) | 2023.10.29 |
JVM 구조 (0) | 2023.10.22 |