예외 처리 (Exception Handling) – 안정적인 코드를 작성하는 법
728x90

예외 처리 (Exception Handling)

예외(Exception)란 무엇인가?

프로그램 실행 중에 발생할 수 있는 비정상적인 상황을 의미한다. 예를 들어, 배열의 인덱스를 초과해서 접근하려는 시도, 파일이 없을 때 파일을 읽으려는 시도 등이 예외 상황에 해당한다.

  • Checked Exception: 컴파일 시점에 발생 가능성을 컴파일러가 확인해야 하는 예외. 예: IOException, SQLException.
  • Unchecked Exception: 런타임에서만 확인되는 예외. 예: NullPointerException, ArrayIndexOutOfBoundsException.

예외처리가 java에서 중요한 이유는 아래와 같다.

 

  • 프로그램 안정성
    • 예외를 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있다.
  • 사용자 경험 개선
    • 사용자에게 친숙한 오류 메시지나 대체 작업을 제공할 수 있다.
  • 디버깅 용이성
    • 적절한 예외 처리는 문제가 발생한 원인을 추적하고 해결하기 쉽게 만든다.

예외 처리의 구조

try-catch-finally 블록의 사용

 

  • try 블록: 예외가 발생할 가능성이 있는 코드를 감싸는 블록이다.
  • catch 블록: try에서 발생한 예외를 처리한다.
  • finally 블록: 예외 발생 여부와 관계없이 항상 실행되는 블록이다. 주로 리소스 정리 용도로 사용한다.
public class ExceptionExample {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // 예외 발생
        } catch (ArithmeticException e) {
            System.out.println("예외 발생: " + e.getMessage());
        } finally {
            System.out.println("프로그램 종료");
        }
    }
}
/* 출력
예외 발생: / by zero
프로그램 종료
*/

 

 

throwthrows 키워드의 차이

 

  • throw: 특정 예외를 명시적으로 발생시킬 때 사용한다.
     
if (value < 0) {
    throw new IllegalArgumentException("음수는 허용되지 않습니다.");
}

 

  • throws: 메서드가 호출자에게 예외를 전달할 수 있음을 선언한다.
public void readFile() throws IOException { // IOException 발생 가능 }

예외 처리의 종류

체크 예외와 언체크 예외의 차이

  • Checked Exception:
    • 컴파일러가 예외 처리를 강제한다.
    • 예: IOException, SQLException.
    • 사용 시점: 외부 리소스(파일, 네트워크 등)와 상호작용 시.
  • Unchecked Exception:
    • 컴파일러가 처리 여부를 확인하지 않는다.
    • 예: NullPointerException, ArithmeticException.
    • 사용 시점: 주로 프로그래머의 실수로 발생.

자주 발생하는 예외 종류

NullPointerException: 객체가 null인 상태에서 메서드나 필드에 접근하려 할 때 발생한다.

String text = null;
System.out.println(text.length()); // 예외 발생

IOException: 입출력 작업 중 문제가 발생할 때 발생한다.

BufferedReader br = new BufferedReader(new FileReader("nonexistent.txt")); // 예외 발생

ArrayIndexOutOfBoundsException: 배열의 인덱스를 초과하려고 할 때 발생한다.

 
int[] numbers = {1, 2, 3};
System.out.println(numbers[3]); // 예외 발생

질문

Error와 Exception의 차이는 무엇인가요?

  • Error는 실행 중 일어날 수 있는 애플리케이션에서 복구할 수 없는 심각한 문제를 말합니다.
    • 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 개발자가 직접 처리하거나 예측하기 어려운 상황 UncheckedException에 속합니다. 
    • 런타임에서 실행 시 발생되며 전부 예측 불가능한 Unchecked Error에 속한다.
    • ex) OutOfMemoryError, StackOverflowError, VirtualMachineError.
  • Exception:
    • Exception은 애플리케이션에서 발생하는 문제로, 개발자가 적절히 처리하여 복구할 수 있습니다.
    • 일반적인 실행 오류를 나타내며, 명시적으로 예외 처리를 구현할 수 있습니다.
    • ex)  IOException, NullPointerException, ArithmeticException.

Checked Exception과 Unchecked Exception의 차이점은 무엇인가요?

  • Checked Exception:
    • 컴파일 타임에 체크되는 예외로, 반드시 예외 처리를 해야 합니다.
    • 예외 처리(try-catch 또는 throws)가 없으면 컴파일 오류가 발생합니다.
    • 예: IOException, SQLException.
    • 장점: 예외 처리가 강제되므로 안정성이 높습니다.
    • 단점: 코드를 복잡하게 만들 수 있습니다.
  • Unchecked Exception:
    • 런타임에 발생하며, 예외 처리가 강제되지 않습니다.
    • RuntimeException을 상속받은 클래스들이 해당됩니다.
    • 예: NullPointerException, IndexOutOfBoundsException.
    • 장점: 예외 처리가 강제되지 않아 코드가 간결해집니다.
    • 단점: 예외 처리가 누락될 위험이 있습니다.

커스텀 예외(Custom Exception)를 설계해야 하는 이유와 방법은 무엇인가요?

이유

 

  • 기존 예외 클래스는 특정 비즈니스 로직에 적합하지 않을 수 있습니다.
  • 사용자 정의 예외를 통해 문제를 더 구체적으로 설명할 수 있습니다.
  • 코드의 가독성과 유지보수성을 높여줍니다.
  • 특정 도메인에 특화된 예외 처리를 명확히 할 수 있습니다.

방법

 

  • Exception 또는 RuntimeException을 상속받습니다.
  • 예외 메시지를 전달할 생성자를 작성합니다.
  • 필요에 따라 추가적인 데이터를 포함하는 필드를 정의합니다.
  • 예외 로깅과 디버깅을 용이하게 하기 위해 super 메서드와 연동합니다.

 

 

이외

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try: 예외가 발생할 가능성이 있는 코드를 작성합니다.
catch: 발생한 예외를 잡아 처리합니다.
throw: 명시적으로 예외를 발생시킬 때 사용합니다.
throws: 메서드에서 예외를 호출자에게 전달할 때 선언합니다.
finally: 예외 발생 여부와 상관없이 항상 실행되는 블록입니다.
  • 자바가 제공하는 예외 계층 구조
Throwable
 ├── Error (복구 불가)
 │    ├── OutOfMemoryError
 │    ├── StackOverflowError
 │    └── VirtualMachineError
 └── Exception (복구 가능)
      ├── IOException (Checked)
      ├── SQLException (Checked)
      └── RuntimeException (Unchecked)
           ├── NullPointerException
           ├── ArrayIndexOutOfBoundsException
           └── ArithmeticException
  • RuntimeException과 RuntimeException가 아닌 것의 차이는?
RuntimeException:런타임 시점에서 발생하며, 명시적 예외 처리가 강제되지 않습니다.예: IllegalArgumentException, NullPointerException.주로 프로그래밍 실수로 인해 발생합니다.
RuntimeException가 아닌 것 (Checked Exception):컴파일 타임에 처리 여부를 검사하며, 예외 처리가 강제됩니다.예: IOException, SQLException.주로 외부 리소스(파일, 네트워크 등)와 관련된 오류입니다.

 

728x90
반응형