반응형

 

 

 

 

예외를 처리하다 보면, 아래와 같은 에러 문구를 쉽게 볼 수 있습니다.

바로 Unhandled exception 입니다.

 

 

 

예외 발생

예외의 종류는 다양하고, 예외가 발생하는 코드도 다양합니다.

본 아티클에서는, 어떤 코드에 의해 예외가 발생하는 상황을

throw new Exception(); 이라는 코드로 대체하겠습니다.

public void firstMethod() {
    System.out.println("First");
    secondMethod();
}

private void secondMethod() {
    System.out.println("Second");
    throw new Exception();
}

위처럼 예외가 발생되었는데, 그것을 처리하는 코드가 없을 때

Unhandled exception 이라는 예외가 발생하고, 컴파일에 실패합니다.

 

 

 

 

예외를 처리

public void firstMethod() {
    secondMethod();
    System.out.println("First");
}

private void secondMethod() {
    try {
        System.out.println("Second");
        throw new Exception();
    } catch (Exception e) {
        System.out.println(e);
    }
}

try catch를 이용해서 Exception을 처리했습니다.

try에서 Exception이 발생하자, 즉시 catch에서 처리됩니다.

그리고 다음 로직으로 이동합니다.

 

 

그런데, 예외가 발생 시 프로그램 동작이 멈춰야할 때가 있습니다.

 

위의 코드에서,

예외가 발생하면 "First"라는 문자열이 출력되지 않아야 한다고 가정해보겠습니다.

 

그럴 때는, thorws를 이용해

예외가 발생하는 메서드(secondMethod)에서

상위 메서드(firstMethod)로 예외를 던지고,

상위에서 처리(catch)하면 됩니다.

public void firstMethod() {
    try {
        secondMethod();
        System.out.println("First");
    } catch (Exception e) {
        System.out.println(e);
    }
}

private void secondMethod() throws Exception {
    try {
        System.out.println("Second");
        throw new Exception();
    } catch (Exception e) {
        throw e;
    }
}

 

 

로직을 자세하게 정리하면 아래와 같습니다.

(풀어써서 길어졌지만 그만큼 간단하니, 이해가 어려우시다면 천천히 읽어보시길 추천드립니다.)

 

1. secondMethod에서 Exception 발생

2. secondMethod 내부에서 Exception 처리(catch)

3. catch 문에서 새로운 Exception 발생

4. throws 키워드 사용하여, secondMethod를 호출한 상위 메서드(firstMethod)로 예외 던지기

5. firstMethod에서 Exception catch

6. System.out.println(e); 로 예외 로그 출력

7. 다음 코드인 System.out.println("First")는 실행되지 않음

 

이렇게 예외가 발생되면 프로그램이 종료되도록 로직을 수정해보았습니다.

(이는 컴파일 후 프로그램 동작 중 발생하는 런타임 에러에 의한 비정상적인 종료와는 다릅니다.)

 

 

 

 

throws하지 않아도 되는 예외? (IllegalArgumentException 등..)

위에서 사용한 Exception은 최상위 예외입니다.

그 아래에는 IllegalArgumentException, IOException 등 다양한 예외가 있습니다.

 

그런데, 일부 예외는 throws를 하지 않아도

Unhandled exception가 발생하지 않습니다.

 

public void firstMethod() {
    try {
        secondMethod();
        System.out.println("First");
    } catch (Exception e) {
        System.out.println(e);
    }
}

private void secondMethod() {
    System.out.println("Second");
    throw new IllegalArgumentException();
}

위 코드에서, secondMethodIllegalArgumentException를 발생시키지만

thorws도 하지 않고, catch도 하지 않습니다.

Exception이었다면 Unhandled exception라는 문구가 발생했을 상황인데요,

 

그 이유는 IllegalArgumentException런타임 예외(또는 Uncheck Exception)이기 때문입니다.

IOException과 같은 컴파일 예외(Check Exception)는 처리가 강제됩니다.

그렇지 않으면 컴파일을 실행할 수 없습니다.

 

하지만 IllegalArgumentException과 같은 런타임 예외는, 처리가 강제되지 않습니다.

프로그램 실행 도중 예외가 발생하면, 프로그램이 비정상 종료됩니다.

 

 

비록 처리가 강제되지는 않지만,

특정 예외가 발생할 수 있다는 것을 설명하기 위해서

throws 키워드를 사용하는 것이 어떨까 하는 것이 개인적인 생각입니다.

 

 

 

 

 

 

 

참고 자료 : https://stackoverflow.com/questions/50640610/how-to-use-throws-illegalargumentexception-in-method-declaration

반응형

+ Recent posts