예외 처리(Exception Handling)

Nak Jun Choi·2022년 11월 10일

예외처리란?

  • 에러에 대응할 수 있는 코드를 미리 사전에 작성하여 프로그램의 비정산적인 종료를 방지하고, 정상적인 실행 상태를 유지하기 위한 장치이다.

컴파일 에러와 런타임 에러

컴파일 에러

  • 컴파일 할 때 발생하는 에러를 뜻한다.
  • 보통 빨간줄로 표시된다.
  • 상대적으로 발견하기도 쉽고, 크게 어렵지 않게 해결할 수 있다.

런타임 에러

  • 런타임 시에 발생하는 에러이다.
  • 주로 개발자가 컴퓨터가 수행할 수 없는 특정한 작업을 요청할 때 발생한다.

에러와 예외

  • 에러는 한번 발생하면 복구하기 어려운 수준의 심각한 오류를 의미한다.
  • 예외는 잘못된 사용 또는 코딩으로 인한 상대적으로 미약한 수준의 오류로서 코드 수정등을 통해 수습이 가능한 오류를 지칭한다.

예외 클래스의 상속 계층도

일반 예외 클래스 (Excepton)

  • 런타임 시 발생하는 RuntimeException 클래스와 그 하위 클래스를 제외한 모든 Exception 클래스와 그 하위 클래스들을 가르킨다.
  • 컴파일러가 코드 싱행 전에 예외 처리 코드 여부를 검사한다고 해서 checked 예외라 부르기도 한다.

실행 예외 클래스 (Runtime Exception)

  • 런타임 시 발생하는 RuntimeExeption 클래스와 그 하위클래스를 지칭한다.
  • 컴파일러가 예외 처리 코드 여부를 검사하지 않는다는 의미에서 unchecked 예외라 부르기도 한다.

try - catch 문

try {
    // 예외가 발생할 가능성이 있는 코드를 삽입
} 
catch (ExceptionType1 e1) {
    // ExceptionType1 유형의 예외 발생 시 실행할 코드
} 
catch (ExceptionType2 e2) {
    // ExceptionType2 유형의 예외 발생 시 실행할 코드
} 
finally {
    // finally 블럭은 옵셔널
    // 예외 발생 여부와 상관없이 항상 실행
} 
  • try 블록 안에는 예외가 발생할 가능성이 있는 코드를 삽입한다.
  • catch블록은 예외가 발생하는 경우에 실행되는 코드로, 여러 종류의 예외를 처리할 수 있다.
  • finally블록은 예외 발생 여부와 관계없이 무조건 실행된다.
public static void main(String[] args) {

        try {
            System.out.println("[소문자 알파벳을 대문자로 출력하는 프로그램]");
            printMyName(null); // (1) 예외 발생
            printMyName("abc"); // 이 코드는 실행되지 않고 catch 문으로 이동
        } 
        catch (ArithmeticException e) {
            System.out.println("ArithmeticException 발생!"); // (2) 첫 번째 catch문
        } 
        catch (NullPointerException e) { // (3) 두 번째 catch문
            System.out.println("NullPointerException 발생!"); 
            System.out.println("e.getMessage: " + e.getMessage()); // (4) 예외 정보를 얻는 방법 - 1
            System.out.println("e.toString: " + e.toString()); // (4) 예외 정보를 얻는 방법 - 2
            e.printStackTrace(); // (4) 예외 정보를 얻는 방법 - 3
        } 
        finally {
            System.out.println("[프로그램 종료]"); // (5) finally문
        }
    }

    static void printMyName(String str) {
        String upperCaseAlphabet = str.toUpperCase();
        System.out.println(upperCaseAlphabet);
    }
}

// 출력값
[소문자 알파벳을 대문자로 출력하는 프로그램]
NullPointerException 발생!
e.getMessage: null
e.toString: java.lang.NullPointerException
[프로그램 종료]
java.lang.NullPointerException
	at RuntimeExceptionTest.printMyName(RuntimeExceptionTest.java:20)
	at RuntimeExceptionTest.main(RuntimeExceptionTest.java:7)
   
   
   

예외 전가

반환타입 메서드명(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
	
}
  • 특정 메서드에서 모든 종류의 메서드가 발생할 가능성이 있는 경우 위와 같이 작성할 수 있다.
public class ThrowExceptionTest {

    public static void main(String[] args) {
        try {
            throwException();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }

    static void throwException() throws ClassNotFoundException, NullPointerException {
        Class.forName("java.lang.StringX");
    }
}
  • 예외를 main()throws키워드를 사용하여 해당 예외를 발생한 메서드안에서 처리하지 않고 메서드를 호출한 곳으로 떠넘길 수 있다.

  • throw키워드를 사용하면 의도적으로 예외를 발생시킬 수 있다.

try {
            Exception intendedException = new Exception("의도된 예외 만들기");
            throw intendedException;
        } catch (Exception e) {
            System.out.println("의도적으로 예외 발생");
        }
    }
    
}```
profile
HelloWorld

0개의 댓글