출처 - 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() // 원인 예외를 반환
'Java' 카테고리의 다른 글
Object클래스 - StringBuffer, StringBuilder (0) | 2022.10.11 |
---|---|
Object클래스(equal, hashCode, toString, String클래스, join) (0) | 2022.10.11 |
내부 클래스(inner class), 익명 클래스(anonymous class) (0) | 2022.10.04 |
추상 클래스(abstract class), 인터페이스(interface) (1) | 2022.10.03 |
다형성(polymorphism) (0) | 2022.10.03 |