Throwable 클래스의 직접 하위 클래스인 Exception 클래스와 RuntimeException 클래스도 Throwable과 같은 형식의 생성자를 가진다. - Java31 참고
import java.util.Scanner;
public class ThrowAndCatch {
// -- sw값에 따라 예외 발생 -- //
static void check(int sw) throws Exception{
switch(sw) {
case 1: throw new Exception("검사 예외 발생!");
case 2: throw new Exception("비검사 예외 발생!");
}
}
// -- check를 호출 -- //
static void test(int sw) throws Exception{
check(sw); // 이 호출은 검사 예외Exception 발생 가능성이 있다.
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("sw: ");
int sw = stdIn.nextInt();
try {
test(sw);
}catch(RuntimeException e) { // e: 예외 RuntimeException과 그 하위 클래스를 포착한다.
System.out.println(e.getMessage());
}catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
- check 메서드 : 인수 sw값에 따라 Exception 또는 RuntimeException 예외를 발생시키는 메서드이다.
- throw절 :
throw Exception
부분은 throw절이다. 검사 예외를 던질 가능성이 있는 메서드는 모두 throw절에 열거한다. 검사예외항목을 열거하지 않으면 컴파일 오류가 발생하나, 비검사예외의 열거는 불필요하다. - 예외 던지기 : switch문에서 sw에 따라 예외를 던진다. 예외를 던지는 것이 throw문이고, 그 형식은
throw식
이다. 여기선 new로 인스턴스를 생성한 후에, throwable의 하위 클래스를 지정하여 예외를 던질 수 있다.
생성자가 호출되며 "검사 예외 발생" 이상 메세지로 예외 인스턴스에 기록된다. - test 메서드 : check 메서드를 호출하는 메서드이다. check 메서드에서 Exception이 발생한다는 것을 알고 있기 때문에 이 메서드에서도
throw Exception
을 열거해주어야 한다. - 예외의 상세 메세지 : 예외 핸들러에서 e.getMessage를 통해 상세 메세지를 출력한다.
- catch절의 매개 변수 e : Exception형이지만 Exception과 RuntimeException 모두 캐치할 수 있다.
- getMessage 메서드 : 동적 결합에 의해 e의 참조 대상형에 따라 메서드의 동작이 달라진다.
주요 비검사 예외
- NullPointerException
null 참조를 통해 필드 접근이나 메소드 호출할 때 발생하는 예외이다. - ClassCastException
특정 객체를 상속 관계가 없는 클래스로 캐스트하려고 할 때 발생하는 예외이다. - ArrayIndexOutOfBoundsException
배열에 부정한 인덱스를 적용했을 때 발생한다. - StringIndexOutOfBoundsException
String형 문자열에 부정한 인덱스를 적용했을 때 발생한다. ArrayIndexOutOfBoundsException의 서브 클래스이다. - IllegalArgumentException
부적절한 인수가 메서드에 전달됐을 때 발생하는 메서드이다.
'Java > Java 기초' 카테고리의 다른 글
Java33 예외를 다른 메소드에 넘기기 (0) | 2020.06.18 |
---|---|
Java31 예외 클래스- Throwable 클래스 (0) | 2020.06.12 |
Java30 오류 처리와 try-catch-finally 구문 (0) | 2020.06.10 |
Java29 String.equals, compareTo, String.format메서드 (0) | 2020.06.09 |
Java28 String. intern, length, charAt, indexOf (0) | 2020.06.08 |