본문 바로가기

Java

예외처리

출처 - Java의 정석 기초편 (남궁 성)


1. 프로그램 오류
- 컴파일 에러: 실행 불가
- 런타임 에러: 실행중 발생, 프로그램 종료
- 논리적 에러: 실행은 되지만 의도와 다르게 동작


2. 자바 런타임 에러
- 에러(error): 심각한 오류(메모리 부족, 스택오버플로우)
- 예외(exception): 미약한 오류 → 예외처리


3. 예외 클래스 계층구조
- Object클래스(최고 조상), Throwable(모든 오류의 조상), Exception(모든 예외의 조상)
- Exception과 자손들: 사용자 실수
- RuntimeException과 자손들: 프로그래머 실수


4. try-catch문
- 예외처리: 프로그램 실행시 발생하는 예외의 발생에 대비한 코드 작성해서 비정상 종료를 막고 정상적인 실행상태 유지
- catch블럭 괄호 () 내 처리하고자 하는 예외와 같은 타입의 참조변수 선언
- Exception클래스 타입의 참조변수 선언시 모든 예외 처리 가능(마지막 catch블럭에 작성)

 

try {
    // 예외가 발생할 가능성이 있는 문장 작성
} catch (Exception1 e1) {
    // Exception1 발생시 이를 처리하기 위한 문장
} catch (ExceptionN eN) {
    // 예외의 종류와 일치하는 단 한 개 catch블럭만 수행, 없으면 예외 처리되지 않고 비정상 종료
}



5. printStackTrace(), getMessage()
- 예외 발생 → 예외 객체 생성(예외 정보)
- 참조변수가 예외 객체 주소 가리킴, 유효범위 catch블럭 내 사용
- printStackTrace(): 예외 발생시 호출스택에 대한 정보와 예외 메시지 출력
- getMessage(): 예외 메시지 출력


6. 멀티 catch블럭
- 내용이 같은 catch블럭을 기호 | 를 이용해 하나로 합친 것(코드 중복 제거)
- 공통 분모인 조상 멤버만 사용 가능(굳이 사용하려면 형변환 후 호출)
- 상속 관계 사용 불가(불필요 코드)

 

try {

} catch (ExceptionA | ExceptionB e) {
    e.printStackTrace();
}



7. 예외 발생시키기
- 연산자 new 이용해 예외 객체 생성
- 키워드 throw 이용해 예외 발생

 

Exception e = new Exception(“예외 메시지”);
throw e; // 한 줄로 throw new Exception(“예외 메시지”);



8. 컴파일러 예외처리 체크
- checked예외(Exception과 자손들): 예외처리 필수
- unchexked예외(RuntimeException과 자손들): 예외처리 선택


9. 메서드에 예외 선언
- try-catch문: 직접 예외처리
- 예외 선언: 키워드 throws 이용해 알리기 → 예외처리 되지 않음
- 예외 선언시 checked예외 try-catch문 처리 안 해도 컴파일 ok

 

void method() throws Exception1, … ExceptionN {
    // 메서드 내용
}

void method() rhrows Exception { // 모든 종류 예외 발생 가능
    // 메서드 내용
}



10. finally블럭
- 예외 발생여부에 상관없이 실행되어야할 코드
- try → catch → finally

 

try {
    // …
} catch (Exception1 e1) {
    // …
} finally {
    // 예외 발생여부 상관없이 항상 수행될 코드
}



11. 예외 되던지기(exception re-throwing)
- 호출한 메서드와 호출된 메서드 양쪽에서 예외처리
- 예외를 처리한 뒤 다시 예외를 발생시키는 것

 

class Exception re-throwing {
    public static void main(String[] args) {
        try {
            method1();
        } catch (Exception e) { // 2. 예외처리
            System.out.println(“main메서드에서 예외처리 완료”);
        }
    }
    
    static void method1() throws Exception { // 예외 선언
        try {
            throw new Exception(); // 예외 발생
        } catch (Exception e) { // 1. 예외처리
            System.out.println(“method1메서드에서 예외처리 완료”);
            throw e; // 다시 예외 발생
        }
    }
}



12. 연결된 예외(chained exception)
- 예외 A가 예외 B를 발생시키면, A는 B의 원인 예외(cause exception)
- 예외 생성 → 원인 예외 지정 → 예외 발생
- 여러 예외를 하나로 묶어서 다루기 위해 사용
- checked예외를 unchecked예외로 변경하려할 때 사용(런타임 예외 안에 예외 포함)

 

Throwable initCause(원인 예외 지정) // 지정한 예외를 원인 예외로 지정
Throwable getCause() // 원인 예외를 반환