예외처리

kailyn·2024년 9월 5일

JAVA

목록 보기
12/17

1. 예외처리 개요

1. 예외 처리 정의 및 사용 이유

1-1. 예외 처리란?

💡 오류(Error)와 예외(Exception)

오류: 시스템 상에서 프로그램에 심각한 문제가 발생하여 실행중인 프로그램이 종료되는 것을 말하며 개발자가 미리 예측하거나 코드로 처리하는 것이 불가능 한 경우를 말한다.
(ex: JVM 에러, 정전, 컴퓨터 자체 하드웨어적인 문제 등)

예외: 오류와 마찬가지로 실행중인 프로그램을 종료시키는 것이 일반적이지만 발생할 수 있는 상황을 개발자가 미리 예측하고 처리할 수 있는 미약한 오류를 말한다.
(ex: if-else, try/catch 등)

예외 상황의 경우는 개발자가 적절히 처리하여 코드의 흐름을 컨트롤(비정상적인 종료를 할 수도 있고 그렇지 않게 할 수도 있게) 할 수 있다.

1-2. 예외 처리를 사용하는 이유

💡 오류나 예외는 사용자에게 좋지 않은 사용 경험을 제공할 수 있다. 하지만 미리 예측하고 컨트롤 할 수 있는 예외를 처리함으로써 프로그램이 예상치 못한 상황에 봉착하지 않도록 코드의 안정성과 신뢰성을 높여 이를 미연에 방지하거나 의도한 방향으로 컨트롤 할 수 있다. 또한 개발 시에도 디버깅을 용이하게 해서 예외가 발생한 원인과 위치도 쉽게 파악할 수 있어 용이하다.

2. 예외 클래스의 종류

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

  • 오류와 예외는 모두 Throwable을 상속 받는다.
  • 예외의 최상위 클래스는 Exception 클래스이다.
  • Unchecked Exception 계열은 기본적 이미 처리되어 있고 실행 중인 프로그램이 종료되게 작성되어 있다.
  • Checked Exception 계열은 반드시 예외 처리를 해야 하고 하지 않으면 컴파일 에러가 발생한다.
  • RuntimeException타입의 예외들은 런타임 시점에 해당 예외 클래스 타입의 Exception이 발생한다.

2. RuntimeExcpetion 후손 클래스 몇 가지

  • ArithmeticException
    0으로 나누는 경우 발생
    ```java
    int dividend = 3;
    System.out.println(dividend / 0);
    ```

  • ArrayIndexOutOfBoundsException
    배열의 index범위를 넘어서 참조하는 경우 발생
    ```java
    int[] intArr = new int[0];
    System.out.println(intArr[1]);
    ```

  • NullPointerException
    인스턴스가 참조되지 않은 상태(Null)로 인스턴스에 접근하는 경우 발생
    ```java
    int[] intArr = null;
    System.out.println(intArr[0]);
    ```

  • ClassCastException
    형변환(Cast연산자 사용) 시 자료형에 문제가 있을 때 발생
    ```java
    Object obj = new String("hello");
    int num = (Integer)obj;
    ```

  • NegativeArraySizeException
    배열 크기를 음수로 지정한 경우 발생
    ```java
    int[] intArr = new int[-1];
    ```


3. 예외 처리 방법

1. throws로 위임

💡 Exception이 발생하는 메소드(또는 생성자)를 호출한 상위 메소드에게 처리를 위임하는 방식이다.

2. try-catch(또는 try-catch-finally)로 처리

💡 발생한 Exception을 직접 처리하는 방식이다.

  • try 블럭
    예외(Exception)가 발생할 가능성이 있는 코드를 포함하여 작성하는 블럭

  • catch블럭
    try 블럭에서 예외 발생 시 해당 예외 타입(Exception 클래스 타입)에 대한 처리를 기술하는 블럭이다.
    여러 개의 catch블럭을 이어서 사용할 수 있으며 상위 타입의 예외를 처리하는 catch 블럭이 아래 쪽에 위치해야 한다.

  • finally 블럭
    예외 발생 여부와 상관 없이 꼭 실행되어 처리해야 할 코드가 있으면 작성하는 블럭이다. 주로 java.io나 java.sql 패키지의 메소드 처리 시 자원 반납을 위해 사용한다.

3. 오버라이딩 시 예외 발생 가능 범위

  • 상속 시 오버라이딩하는 메소드는 부모 클래스의 원본 메소드보다 더 상위 타입의 예외를 발생 시키면 안된다.

4. try-with-resource 구문

  • 자바 7버전에서 추가된 기능으로 입출력에서 사용되는 스트림의 자원 반납(close())을 finally 블럭을 사용하지 않고 용이하게 처리하기 위해 도입된 문법이다.
try (BufferedReader in = new BufferedReader(new FileReader("test.dat"));){
	
	String s;
	
	while((s = in.readLine()) != null){
		System.out.println(s);
	}

} catch (FileNotFoundException/* | EOFException*/ e) {
	e.printStackTrace();

} catch (IOException e) {
	e.printStackTrace();
}
profile
나는 할 수 있다...!

0개의 댓글