Frinee의 코드저장소

[Java] 예외 처리(exception handling)

by Frinee

1. 프로그램 오류

  • 프로그램 오류(error): 프로그램 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우를 말함.
  • 에러의 종류
    • 컴파일 에러(compile error): 컴파일 시 발생하는 에러
    • 런타임 에러(runtime error): 실행 시 발생하는 에러
    • 논리적 에러(logical error): 실행은 되지만, 의도와 다르게 동작하는 것
  • 프로그램은 런타임 에러를 방지하기 위해 대비를 하는데 자바에서는 프로그램 오류를 에러(error)와 예외(exception)으로 구분함.
    • 에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    • 예외(exception): 프로그램 코드에 의해서 수습될 수 있은 다소 미약한 오류

 

2. 예외 클래스의 계층 구조

  • 예외 클래스는 다음과 같이 두 그룹으로 나뉠 수 있다.
    • Exception클래스: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
    • RuntimeException클래스: 프로그래머의 실수로 발생하는 예외

  • IOException: 입출력 작업 중 발생하는 예외 (파일 읽기/쓰기, 네트워크 입출력 등)
  • ClassNotFoundException: 클래스 파일을 찾을 수 없을 때 발생
  • RuntimeException: 실행 중(Runtime)에 발생하는 예외들의 부모 클래스
  • ArithmeticException: 수학적 연산 오류가 발생할 때 발생
  • ClassCastException: 잘못된 형변환을 시도할 때 발생
  • NullPointerException: null 값을 참조하려고 할 때 발생
  • IndexOutOfBoundsException: 배열이나 리스트 등의 인덱스가 범위를 벗어날 때 발생

 

3. 예외 처리: try-catch

  • 예외처리(Exception Handling)
    • 정의: 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것
    • 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
  • 예외를 처리하기 위해서는 try-catch문을 활용하며 그 구조는 다음과 같다
try {
	// 예외가 발생할 가능성이 있는 문장을 넣는다.
} catch(Exception1 e1){
	// Exception1이 발생한 경우, 이를 처리하기 위한 문장을 넣는다.
} catch(Exception2 e2){
	// Exception2가 발생한 경우, 이를 처리하기 위한 문장을 적는다.
}
  • 하나의 try블록 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch블록이 올 수 있으며, 이 중 발생한 예외의 종류와 일치하는 단 한 개의 catch블록만 수행
  • catch블록 안에 또 다른 try-catch블록을 사용할 경우, 변수명을 다르게 해줘야 함.

3.1. try-catch문에서의 흐름

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

3.2. printStackTrace()와 getMessage()

  • 예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨있음.
  • printStackTrace(): 예외발생 당시의 호출(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
  • getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

4. 예외 처리: 메서드에 예외 선언하기

  • 메서드에 예외를 선언하려면, 메서드의 선언부에 키워드 throw를 사용해서 메서드 내에 발생할 수 있는 예외를 적어주면 됨.
void method() throws Exception1, Exception2, ... ExceptionN {
	// 메서드 내용
}
  • 이로 인해 메서드 내에서 발생할 수 있는 예외를 메서드의 선언부에 명시하여 견고한 프로그램 코드를 작성할 수 있도록 도와줌.

 

5. finally 블럭

  • finally 블럭은 예외 발생여부와 상관없이 실행되어야 할 코드를 포함시킬 목적으로 사용
  • try-catch문의 끝에 선택적으로 덧붙여 사용할 수 있으며, try-catch-finally의 순서로 구성됨.
try {
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
	// 예외처리를 위한 문장을 적는다.
} finally {
	// 예외의 발생 여부에 관계없이 항상 수행되어야 하는 문장들을 넣는다.
	// finally블럭은 try-catch문의 맨 마지막에 위치해야 한다.
}
 

블로그의 정보

프리니의 코드저장소

Frinee

활동하기