JAVA/Java

[Java] 자바의 예외와 예외처리

민트맛녹차 2022. 8. 31. 17:48

Throwable 클래스

Throwable 클래스는 모든 Error와 Exception의 최상위 클래스이다.  이 클래스의 대표적인 메서드 둘은 다음과 같다.

public String getMessage();
public void printStackTrace();

Throwable의 하위 클래스인 Error와 Exception은 예외적인 상황이 발생했음을 나타내는데 사용되며, 예외적인 상황에서 이들의 인스턴스가 생성된다.

 

Error와 Exception

오류(Error)와 예외(Exception)의 차이는 다음과 같다.

오류(Error)는 'IOError' 나 'VirtualMachineError' 같이 처리가 불가능한 심각한 문제를 의미한다. 개발자는 오류를 미리 예측하여 방지할 수 없다.

예외(Excetion)는 처리가 가능한 문제를 의미한다. 개발자가 미리 예측하여 방지할 수 있으므로 예외 처리가 필요하다.

예외는 RuntimeException의 하위 클래스인 Unchecked Exception 과 RuntimeException을 제외한 Exception의 하위 클래스인 Checked Exception으로 구분된다.

 

Checked Exception

Checked Exception은 Compile Exception이라고도 하며 Exception을 직접 상속받는다.

컴파일 시점에 예외를 catch하는지 확인하며 예외 처리를 하지 않는다면 컴파일 에러가 발생한다. 즉 반드시 예외를 처리해야 한다. 예외가 발생하는 메서드나 생성자에서 throws 예약어를 활용하여 예외를 호출한 메서드나 생성자에 전달할 수 있다.

 

Unchecked Exception

Unchecked Exception은 RuntimeException을 상속받는다.

컴파일 시점에 예외를 catch 하는지 확인하지 않으므로 컴파일 시 예외가 발생하는지 판단할 수 없다. 즉, 반드시 예외 처리를 하지 않아도 된다. 예외가 발생하는 메서드나 생성자에서 throws 예약어를 사용해 처리할 필요가 없다. (처리해도 상관 없음)

 

예외 처리

try-catch-finally

try {
    //예외 발생 코드
}
catch ( 예외 ) {
    //예외 처리 코드
}
finally {
    //공통 처리 코드
}

try에서는 예외가 발생할 수 있는 코드를 쓰고, catch 에서 발생한 에러를 처리해 주며, finally에서는 예외 처리와 관계 없이 공통으로 수행되는 코드를 쓰면 된다.

catch 사용 시 상위 Exception을 먼저 처리하면 아래 예외들은 실행되지 않으므로, 하위 예외부터 차례대로 구성해야 한다.

 

try-with-resources

try ( resource ) {
    ...
}
catch ( 에외 ) {
    ...
}

try 에 종료 과정이 필요하는 리소스를 생성할 수 있다. try-with-resource 문을 빠져나오게 되면 자동으로 리소스가 종료된다. finally에서 try-catch를 통해 리소스를 종료하여 코드가 복잡해지는 단점을 방지해 준다.

try 구문은 실행 속도가 느리므로, 과도한 예외처리는 심각한 성능 저하로 이어진다. 따라서 불필요한 try 구문은 자제해야 한다.

 

throws

public void something() throws Exception { ... }

try {
    something()
}
catch (Exception e) {
    ...
}

try-catch 를 통해 예외가 발생하는 메서드/생성자에서 예외를 처리하지 않고 throws를 사용함으로써 예외를 호출한 메서드/생성자에게  예외를 던질 수 있다.

throw new Exception();

또한 throw 를 통해 코드 내에서 직접 예외를 호출할 수도 있다.

 

 

참조
윤성우의 열혈 JAVA  프로그래밍
https://toneyparky.tistory.com/40
https://docs.oracle.com/javase/8/docs/api/index.html