본문 바로가기
IT

[Do it! 자바 프로그래밍 입문] 14 예외 처리

by csongin 2022. 6. 12.
728x90
예외 처리

예외 처리

오류란 무엇인가?

컴파일 오류(compile error)

프로그램 코드 작성 중 발생하는 문법적 오류

 

실행 오류(runtime error)

실행 중인 프로그램이 의도하지 않은 동작을 하거나(bug) 프로그램이 중지되는 오류

실행 오류시 비정상 종료는 서비스 운영에 치명적

오류가 발생할 수 있는 경우에 로그(log)를 남겨 추후 이를 분석하여 원인을 찾아야 함

자바는 예외 처리를 통하여 프로그램의 비정상 종료를 막고 log를 남길 수 있음

 

오류와 예외 클래스

시스템 오류(error)

가상 머신에서 발생, 프로그래머가 처리할 수 없음

동적 메모리 없는 경우 , 스택 오버 플로우 등

 

예외(Exception)

프로그램에서 제어할 수 있는 오류

읽어 들이려는 파일이 존재하지 않는 경우, 네트워크 연결이 끊어진 경우

Do it 자바 프로그래밍 입문

예외 클래스의 종류

모든 예외 클래스의 최상위 클래스는 Exception

다양한 예외 클래스가 제공됨 

Do it 자바 프로그래밍 입문

try-catch-finally 문

finally 에서 프로그램 리소스를 정리함

try { } 블록이 실행되면 finally { } 블록은 항상 실행됨

리소스를 정리하는 코드를 각 블록에서 처리하지 않고 finally에서 처리함

try{
    예외가 발생할 수 있는 부분
}catch(처리할 예외 타입 e) {
    예외를 처리하는 부분
}finally {
    항상 수행되는 부분
}

try-with-resources 문

리소스를 자동 해제 하도록 제공해주는 구문

자바 7부터 제공됨

close()를 명시적으로 호출하지 않아도 try { } 블록에서 열린 리소스는 정상적인 경우, 예외 발생한 경우 모두 자동 해제됨

해당 리소스가 AutoCloseable을 구현하고 있음

FileInputStream의 경우 AutoCloseable을 구현하고 있음

Do it 자바 프로그래밍 입문

향상된 try-with-resources 문

자바 9에서 제공되는 구문

외부에 선언된 리소스도 변수만 사용가능

// 자바 9 이전

AutoCloseObj obj = new AutoCloseObj();
try(AutoCloseObj obj2 = obj){
    thorow new Exception();
 }catch(Exception e) {
     System.out.println("예외 부분입니다.");
 }
// 자바 9 이후

AutoCloseObj obj = new AutoCloseObj();
try(obj){
    thorow new Exception();
 }catch(Exception e) {
     System.out.println("예외 부분입니다.");
 }

예외 처리 미루기

throws를 사용하여 예외처리 미루기

메서드 선언부에 throws를 추가 

예외가 발생한 메서드에서 예외 처리를 하지 않고 이 메서드를 호출한 곳에서 예외 처리를 한다는 의미

main()에서 throws를 사용하면 가상 머신에서 처리됨

 

다중 예외 처리 시 주의 사항

예외가 다양한 경우 가장 최상위 클래스인 Exception 클래스에서 예외를 처리할 수 있음

public static void main(String[] args) {
    ThrowsException test = new ThrowsException();
    try{
        test.loadClass("a.txt", "java.lang.String");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch(Exception e) {
        e.printStackTrace();
    } // Exception 클래스로 그 외 예외 상황 처리
}

단 Exception 클래스는 모든 예외 클래스의 최상위 클래스이므로 가장 마지막 블록에 위치해야 함

사용자 정의 예외

JDK에서 제공되는 예외 클래스 외에 사용자가 필요에 의해 예외 클래스를 정의하여 사용

기존 JDK 예외 클래스 중 가장 유사한 클래스에서 상속

기본적으로 Exception에서 상속해도 됨

public class IDFormatException extends Exception {
    public IDFormatException(String message) { // 생성자의 매개변수로 예외 상황 메시지를 받음
        super(message);
    }
}

사용자 정의 예외 클래스 예제

public class IDFormatTest {
    private String userID;
    
    public String getUserID() {
        return userID;
    }
    // 아이디에 대한 제약 조건 구현
    public void setUserID(String userID) throws IDFormatException { // IDFormatException 예외를 setUserID() 메서드가 호출될 때 처리하도록 미룸
        if(userID == null) {
            throw new IDFormatException("아이디는 null일 수 없습니다."); // 강제로 예외를 발생시킴
        }
        else if(userID.length() < 8 || userID.length() > 20) {
            throw new IDFormatException("아이디는 8자 이상 20자 이하로 쓰세요."); // 강제로 예외를 발생시킴
        }
    this.userID = userID;
    }
반응형