본문 바로가기

BE/JAVA

[JAVA] 자바 예외 처리(Exception Handling)

목차
1. 예외 처리란 ?
2. 예외 VS 에러  
3. 예외 클래스
4. Checked VS Uncheckd Exception
5. 예외 처리 기법  

 

📌 1. 예외 처리란?

예외 처리란, 예외나 에러가 발생 가능한 상황을 미연에 방지하기 위해서 개발자가 코드 상으로 미리 예외를 처리하는 것을 말합니다.

📌 2. 예외 VS 오류

1) 예외(Exception)란 ?
예외(Exception)란 에러보다 심각도가 낮으며 프로그램의 정상적인 흐름을 방해하는 상황의 원인을 에러라고 합니다.
예를 들어 프로그램의 예외가 발생하는 경우는 파일을 읽으려고 하는데 빈 파일이거나(FileNotFoundException), 클래스를 로딩해야 하는데 해당 클래스가 없는 경우(ClassNotFoundException)등 입니다.
예외는 Checked Exception 과 UnChecked Exception으로 나뉘는데요.
자세한 내용은 아래 4. Checked Exception VS Unchecked Exception 에서 설명드리겠습니다.

2) 에러(Error)란 ?
에러(Error)란, 프로그램이 오작동되거나 비정상적으로 종료되어 복구할 수 없는 심각한 상황의 원인을 에러라고 합니다.
프로그램에 발생하는 심각한 상황은 어떤 상황일까요?
예를 들어 메모리가 부족, 메소드 무한 호출, 스택 오버플로우되는 상황이며, 이러한 심각한 상황을 발생시키는 원인이 에러입니다.
또한 이 에러는 컴파일 에러와 런타임 에러로 분류되는 데요. "컴파일 에러(Complie Error)"는 컴파일 시 소스코드에서 발생하는 오류이며, "런타임 에러(Runtime Error)"는 런타임시 발생하는 에러입니다.

˙ 컴파일 에러 (Complie Error)
컴파일 시 맞춤법, 세미콜론 생략 등 소스코드 문법 오류로 인해 발생하는 오류
˙ 런타임 에러 (Runtime Error)
런타임 단계에서 무한 루프, 널 포인트 에러, 잘못된 메모리 참조 등 프로그램 설계 미숙으로 인해 발생하는 오류

📌 3. 예외 클래스

예외 클래스들은 모두 최상위 예외 클래스인 Throwable 클래스를 상속 받습니다.

📌 4. Checked Exception VS Unchecked Exception

위의 계층 구조에서 Exception 클래스는 여러 자식 예외 처리 클래스를 가지고 있습니다.
자식 클래스들은 Checked Exception과 UnChecked Exception 두 가지 분류로 나눌 수 있습니다.
Checked / UnChecked Exception의 차이점은 기본적으로 예외 처리 필수 여부인데요.
Checked Exception은 반드시 예외 처리해야 하는 클래스들이며 UnChecked Exception은 그렇지 않아도 되는 클래스들입니다.

˙ Checked Exception
Runtime Exception 계열을 제외한 모든 예외 클래스이며 반드시 예외 처리해야 하는 예외 클래스 입니다.
반드시 예외처리해야 하기 때문에 컴파일 단계에서 확인된 예외들이며 IOException, SQLException 등이 있습니다.

˙ UnChecked Exception
Runtime Exception 계열의 예외 클래스이며 예외 처리는 선택적으로 수행합니다.
개발자들의 로직 오류로 발생할 수 있는 오류들이기 때문에 예외처리가 필수가 아니며 선택적으로 수행합니다.
주요 예외 클래스로는 NullPointerException, IndexOutOfBoundException 등이 있습니다.

아래 표로 두 분류의 차이점을 자세히 알아보겠습니다.

Checked Exception UnChecked Exception
반드시 예외 처리(try/catch) 선택적으로 예외 처리
Runtime Exception 계열을 제외한
모든 Exception 클래스
Runtime Exception 클래스 및 자식 클래스
컴파일 단계에서 확인 런타임 단계에서 확인
IOException, SQLException,
ClassNotFoundException
NullPointerException, IndexOutOfBoundException,
IllegalArgumentException
   

 

📌 5. 예외 처리 기법 (try/catch/finally)

예외를 처리하기 위해서는 기본적으로 try-catch 블록으로 구현하면 됩니다.
finally 블록을 선언한 경우 finally 블록 내 구문은 항상/무조건 실행됩니다.

예외 발생한 경우
순서 : try 블록 > catch 블록 > finally 블록
try 블록에서 예외(Exception)이 발생할 경우 try 블록 > catch 블록으로 빠져서 > finally 블록을 실행합니다.

예외 발생하지 않은 경우
순서 : try 블록 > finally 블록
try 블록에서 예외가 발생하지 않은 경우 try 블록 > finally 블록이 실행됩니다.

try { //예외가 발생할 가능성이 있는 코드 } 
catch(Exception1 e1) { //예외가 발생했을 때 처리할 코드 } 
catch(Exception2 e2) { //예외가 발생했을 때 처리할 코드 } 
finally { //위 실행 후 마지막으로 항상 실행되는 코드 }