[Java] Exception handling

이지현·2023년 4월 6일
0

Java

목록 보기
28/46
post-thumbnail

✔️ Exception handling

1. 예외처리(Exception Handling)란?

  • 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
  • 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지함

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

자바에서는 실행할 수 있는 오류를 각각 Exception, Error 클래스로 정의하였고 Object 클래스의 자손들(children)임

모든 예외의 최고 조상은 Exception class이고 다음과 같이 표현할 수 있음

여기서 RuntimeException과 그 자손클래스들은 RuntimeException 클래스들이라 하고 나머지들은 Exception 클래스라고 함

  • RuntimeException classes: 프로그래밍 요소들과 관계가 깊음. 0으로 나누려고 하는 경우에 발생하는 ArithmeticException, 값이 null인 참조변수의 멤버를 호출하려다가 생기는 NullPointerException 등등..
  • Exception classes: 외부적인 영향으로 발생할 수 있는 예외. 존재하지 않는 파일이름을 입력했거나(FileNotFoundException), 클래스의 이름을 잘못 적었거나 (ClassNotFoundException), 데이터 형식이 잘못된 경우(DataFormatException)

3. 예외처리하기(try-catch문)

  • if else와 달리 try-catch는 블럭내에 포함된 문장이 하나여도 {} 를 생략할 수 없음
  • try 블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 여러개의 catch블럭을 사용할 수 있음
  • catch 내에 또 다른 try-catch 블럭을 사용할 수 있는데 이때는 다음과 같이 변수 e를 중복해서 사용할 수 없음
class ExceptionEx1{
 public static void main(String args[]) {
     try {
         try{ } catch(Exception e){ }
     }catch (Exception e){
         try{ } catch(Exception e){ }  // --> error 'e' 가 중복 선언
     }
 }
}

3-1. 예외의 발생과 catch 블럭

  • catch 블럭은 괄호()와 블럭 {} 두 부분으로 나눠져 있는데 괄호 ()내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 함
  • 예외가 발생하면 해당 클래스의 인스턴스가 만들어짐
  • 예외가 발생한 문장이 try-catch문의 try 블럭에 있다면, 이 예외를 처리할 수 있는 catch 블럭을 찾게 됨
  • 첫번째 catch 블럭부터 차례로 내려가면서 catch 블럭의 괄호()내에 선언된 참조변수의 종류와 생성된 예외클래스의 instance에 instanceof를 허용해 검사하고 결과가 true이면 예외처리 함. 모든 예외 클래스는 Exception 클래스의 자손이므로 Exception 클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외가 발생해도 이 catch블럭에 의해 처리됨

💡 예외가 발생했을 때 생성되는 예외클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨져 있으며 다음 method들을 통해 정보를 얻을 수 있음

  • printStackTrace(): 예외 발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
  • getMessage(): 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음

4. 예외 발생시키기

키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있으며, 방법은 아래와 같음

  1. 먼저 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만들고
  2. 키워드 throw를 이용해서 예외 발생
Exception e = new Exception("고의로 발생시킴");
throw e;

5. 메서드에 예외 선언하기

지금까지는 예외를 try-catch문을 사용해서 처리했었는데 예외를 method에 선언하는 방법도 있다.

void method() throws Exception1, Exception2, ...ExceptionN {
		...
    }

6. finally 블럭

  • try 블럭이 끝날 때 항상 수행되는 블럭
  • Exception 이 발생하더라도/return, continue, 또는 break 등이라도
PrintWriter out = null;
try {
    out = new PrintWriter(new FileWriter("OutFile.txt");
    ...
} catch (IOException e) {
    ...
} finally {
    if (out != null) 
        out.close();
}

7. 자동 자원 반환 - try-with-resources문

  • Java 7 부터 추가된 try-catch문 변형
  • java.lang.AutoCloseable
  • Suppressed Exception : try-catch 절에서 예외가 발생하면 AutoCloseable.close() 에서 발생할 수도 있는 예외는 억제된 예외로 처리됨
try (FileWriter f = new FileWriter("OutFile.txt");
     PrintWriter out = new PrintWriter(f)) {
    ...
} catch (IOException e) {
    ...
}

8. 사용자 정의 예외 만들기

  • 필요에 따라 새로운 예외 클래스를 정의할 수 있음
class MyException extends Exception {
    private final int ERR_CODE;

    MyException(String msg, int errCode) {
        super(msg);
        ERR_CODE = errCode;
    }

    MyException(String msg) {
        this(msg, 100);
    }

    public int getErrCode() {
        return ERR_CODE;
    }
}

checked Exception

  • 컴파일러에 의해 반드시 예외처리해야 함
  • IOException, SQLException, DataAccessException, ClassNotFoundException, InvocationTargetException, MalformedURLException, RuntimeException, ...

unchecked Exception

  • 컴파일러가 확인하지 않으며, 잘못된 개발에 의해 발생하는 예외상황
  • NullPointerException, ArrayIndexOutOfBound, IllegalArgumentException, IllegalStateException, ...

9. 예외 되던지기(exception re-throwing)

  • 예외 전파(회피)를 위해 다시 예외를 발생시키는 방식
void method1() throws Exception {
    try {
        throw new Exception();
    catch (Exception e) {
        ...
        throw e;
    }
}

10. 연결된 예외(chained exception)

  • 예외 전환을 위해 다른 예외로 발생시키는 방식
try {
    ...
} catch (SpaceException e) {
    InstallException ie = new InstallException();
    ie.initCause(e);
    throw ie;
}
profile
2023.09 ~ 티스토리 이전 / 2024.04 ~ 깃허브 블로그 이전

0개의 댓글