throws
예외를 처리하지 않고 예외처리의 의무를 호출한 메서드에게 전달한다.
예외를 다음과 같이 전달하면 된다.
예외 전가 구조
리턴 타입 메서드명(입력매개변수) throws 예외 크래스명 {
// 예외 발생 코드
}
a()메서드에서 b()메서드를 호출하고, b()메서드 내부에 예외가 발생할 수 있는 코드가 포함돼 있을 때를 살펴보자
void a(){
b(); // 1.호출
}
// 2. 예외 처리
void b(){
try{
//예외 가능 블록
} catch (예외 클래스 타입 참조 변수) {
//예외 처리
}
}
b()메서드가 스스로 예외를 처리했을 때
b() 메서드가 직접 예외 처리를 했다. 이때 a()메서드가 b()를 호출하여 사용하는데 문제가 없다.
void a(){
try{
b(); // 1.호출
}
// 3.예외처리
catch (예외 클래스 타입 참조 변수){
// 예외 처리
}
}
void b() throws 예외 클래스 타입{
// 예외 가능블록
}
b()가 자신을 호출한 a()에 예외를 전가했을 때
b()메서드가 예외를 처리하지 않고 자신을 호출한 메서드로 예외를 전가하고 있다.
예외를 전가받은 a()메서드는 전가된 예외를 처리할 의무를 갖는다.
b()메서드에서 호출한 a()메서드에서 b()가 전가한 예외 클래스 타입에 대해 예외 처리 구문을 작성해야 한다.
아래는 직접 예외 처리를 할 때와 호출메서드로 예외를 전가할 때 예시를 나타낸 것이다.
class A{
void aaa(){
bbb();
}
void bbb(){
try{
Thread.sleep(1000);
}catch (InterruptedException e) {
// 예외 처리 구문
}
}
}
// 예외를 호출 메서드로 전가할 때
class B{
void aaa(){
try{
bbb();
}catch (InterruptedException e){
//예외 처리구문
}
}
void bbb() throws InterruptedException{
Thread.sleep(1000);
}
}
예외를 처리할 때와 마찬가지로 메서드에서 발생할 수 있는 예외가 여러 종류일 때 여러개의 예외를 한 번에 전가할 수 있다.
다중 예외 전가 구조
리턴 아입 메서드명(입력매개변수) throws 예외클래스 A, 예외클래스 B ... {
//여러개의 예외 종류가 발생 할 수 있는 블록
}
EX)
void aaa(){
try{
bbb();
} catch (예외클래스A | 예외클래스B e) {
//예외처리
}
}
void bbb() throw 예외클래스A, 예외클래스B {
//예외발생가능블록
}
예외 한꺼번에 전가하기 예제
// 하위 메서드에서 직접 예외를 처리할 때
class A{
void aaa(){
bbb();
}
void bbb(){
try{
Class cls = Class.forName("java.lang.Object");
Thread.sleep(1000);
} catch (InterruptedException | ClassNotFoundException e){
// 예외 처리 구문
}
}
}
//예외를 호출 메서드로 전가할 때
class B{
void aaa(){
try{
bbb();
} catch (InterruptedException |ClassNotFoundException e){
// 예외 처리 구문
}
}
void bbb() throws InterruptedException, ClassNotFoundException{
Class cls = Class.forName("java.lang.Object");
}
}
'Language > Java' 카테고리의 다른 글
[Java] 쓰레드의 속성 (0) | 2022.04.05 |
---|---|
[Java] 쓰레드, 멀티쓰레드 (0) | 2022.04.05 |
[Java] 리소스 자동 해제 예외 처리 (0) | 2022.04.04 |
[Java] 예외 처리 (0) | 2022.04.04 |
[Java] 이너 인터페이스 (0) | 2022.04.03 |