221017 Throws
예외처리-예외 떠넘기기
메서드 안에서 정상적으로 흘러가는 반면 에러가 나는 경우도 있음
Throws
메서드 안에 예외가 나면 throws가 예외를 붙잡아서 해당 메서드를 호출한 곳으로 예외를 던져줌
throws는 메서드나 생성자를 호출한 곳으로 예외를 떠넘김
throws 키워드가 붙어있는 메서드는 반드시 try블록 내부에서 호출되어야 함.
그리고 catch블록에서 떠넘겨받은 예외를 반드시 처리해야 함
public static void greet(int index) throws Exception{...}
메서드에 throws가 있다면, 반드시 호출할때 try~catch로 해결하라는 뜻
main에도 throws Exception을 줄 수는 있지만, 처리할 방법이 없으니 잘 안 쓴다.
throws
package day10.exception.throws_;
public class ThrowsEx01 {
public static void main(String[] args) {
//메서드에서 예외처리 - throws
//throws구문이 붙어있는 메서드 or 생성자를 호출할 때는 예외를 대신 처리해야 합니다.
//즉, 메서드안에서 예외처리를 강요할 때 사용합니다.
try {
greeting(0);
greeting(1);
greeting(2);
greeting(3);
greeting(4);
} catch (Exception e) {
System.out.println("배열 참조를 벗어났습니다");
}
System.out.println("-------------------------------------------");
try {
calc(0);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다");
}
System.out.println("-------------------------------------------");
try {
greeting(5);
} catch (Exception e) {
//예외처리를 하면 예외의 내용을 알 수가 없기 때문에,
//예외의 내용을 확인하기 위해서 catch영역에서는 항상 사용합니다.-실제 에러가 아닌 에러내용을 보여줌.
e.printStackTrace();
}
System.out.println("프로그램 정상 종료");
}
//static
private static String[] arr= {"안녕하세요", "hello", "니하오", "곤니치와"};
public static void greeting(int index) throws Exception {
System.out.println(arr[index]);
}
public static void calc(int num) throws ArithmeticException{
System.out.println(10/num);
}
}
안녕하세요
hello
니하오
곤니치와
배열 참조를 벗어났습니다
-------------------------------------------
0으로 나눌 수 없습니다
-------------------------------------------
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 4
at day10.exception.throws_.ThrowsEx01.greeting(ThrowsEx01.java:47)
at day10.exception.throws_.ThrowsEx01.main(ThrowsEx01.java:30)
프로그램 정상 종료
throws를 메서드에 넣으면 메서드를 호출할 때 try catch문으로 처리해주어야 한다. 떠넘기는 것.
greeting메서드가 throws로 떠넘겨서 main에서 try catch구문이 나온 것.
e.printStcakTrace는 예외의 내용을 출력문에서 확인해 준다.
package day10.exception.throws_;
public class ThrowsEx02 {
//생성자
public ThrowsEx02()throws Exception{
System.out.println("생성자호출");
aaa();
System.out.println("생성자종료");
}
public void aaa() throws Exception{
System.out.println("aaa시작");
// try {
// bbb(1);
//
// } catch (Exception e) {}
bbb(1);
System.out.println("aaa종료");
}
public void bbb(int i) throws Exception{
System.out.println("bbb시작");
// try {
// System.out.println(i/0);//예외
//
// } catch (Exception e) {}
System.out.println(i/0);//예외
System.out.println("bbb종료");
}
}
main
package day10.exception.throws_;
public class MainClass {
public static void main(String[] args) {
try {
ThrowsEx02 ex = new ThrowsEx02();
} catch (Exception e) {}//try catch를 어디에 쓰느냐에 따라 시작,종료 출력문이 다르게 나타남. 어디서 중간에 끊기는지를 파악해야 한다.
System.out.println("0으로 나눌 수 없습니다");
}
}
생성자호출
aaa시작
bbb시작
0으로 나눌 수 없습니다
throws를 하면 메서드를 강제로 중간에 종료시킨다. 따라서 throws로 떠넘긴 예외처리를 어디서 해주냐에 따라 종료 출력문이 다르게 나타나는 것.
위의 경우 bbb에서 하면 b종료~a종료~생성자종료까지 다 나타나고,
aaa에서 하면 a종료~생성자 종료까지,
생성자에서 하면 생성자 종료까지,
main에서 하면 종료호출문이 나오지 않는다. try catch로 인해 메서드가 중간에 끊겼기 때문.