예외 처리 Exception Handling
- 프로그램에서 예외가 발생했을 경우, 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지하기 위해 예외 처리를 해야 함
- 자바 컴파일러는 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 예최처리 코드를 개발자가 강제적으로 작성하도록 요구함
- 실행 예외의 경우에는 개발자의 경험을 바탕으로 예외 처리 코드를 작성해야 함
예외 처리 코드
- try-catch-finally 블록은 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해줌
1. try 블록에는 예외 발생 가능 코드가 위치
2. try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행;
try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드 실행 -> finally 블록 코드 실행
3. finally 블록은 생략 가능; 예외 발생 여부와 상관 없이 항상 실행할 내용이 있을 경우에만 finally 블록을 작성함;
try 블록과 catch 블록에서 return문을 사용하더라도 finally 블록은 항상 실행됨
예외 종류에 따른 처리 코드
다중 catch
- 다중 catch 블록을 작성해서 블록5 내부 다양한 예외 처리
- catch 블록의 예외 클래스 타입은 try 블록에서 발생된 예외의 종류를 말함
- try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행함
- catch 블록이 여러 개일지라도 단 하나의 catch 블록만 실행 -> 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동
catch 순서
- 다중 catch 블록을 작성할 때 주의할 점: 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야함
- 하위 예외는 상위 예외를 상속했기 때문에 상위 예외 타입도 되기 때문임
예외 떠넘기기
- 경우에 따라서 메소드를 호출한 곳으로 예외를 떠넘길 수 있음 -> throw 키워드 사용
- throw 키워드: 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할
- throw 키워드 뒤에 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 됨
리턴타입 메소드이름(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}
또는
리턴타입 메소드이름(매개변수, ....) throws Exception {
}
- throw 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 함
- catch 블록에서 떠넘겨 받은 예외를 처리해야함
public void method1() {
try {
method2();
} catch(ClassNotFoundException e){
//예외 처리 코드
System.out.println("클래스가 존재하지 않습니다.");
}
}
public void method2() throws ClassNotFoundException {
Class claszz = class.forName("java.lang.String2");
}
==> 호출한 곳에서 예외 처리 예시
확인문제
- try{} 블록에는 예외가 발생할 수 있는 코드를 작성한다
- catch {} 블록은 try {} 블록에서 발생한 예외를 처리하는 블록이다.
- try{} 블록에서 return 문을 사용하면 finally {} 블록은 실행되지 않는다. (x)
- catch{} 블록은 예외의 종류별로 여러 개를 작성할 수 있다.
- 생성자나 메소드의 선언 끝부분에 사용되어 내부에서 발생된 예외를 떠넘긴다.
- throws 뒤에는 떠넘겨야 할 예외를 쉼표(,)로 구분해서 기술한다.
- 모든 예외를 떠넘기기 위해 간단하게 throws Exception으로 작성할 수 있다.
- 새로운 예외를 발생시키기 위해 사용된다. (x)
'Java > 혼자 공부하는 자바' 카테고리의 다른 글
혼자공부하는자바 10-1 예외 클래스 (0) | 2022.12.07 |
---|---|
혼자공부하는자바 9-2 익명 객체 (0) | 2022.12.07 |
혼자공부하는자바 9-1 중첩 클래스와 중첩 인터페이스 소개 (0) | 2022.12.07 |
혼자공부하는자바 8-2 타입 변환과 다형성 (0) | 2022.12.05 |
혼자공부하는자바 8-1 인터페이스 (0) | 2022.12.05 |