public class ExceptionOccurred {
// Checked Exception : RuntimeException을 상속받지 않은 클래스
// Unchecked Exception : RuntimeException을 상속받은 클래스
// throw : 강제로 예외를 발생시킬 수 있음 단, 발생시킨 예외를 catch문에서 잡을 수 있는 처리가 되어있지 않으면 오류 발생(catch문의 Exception은 모든 예외를 잡을 수 있음)
// throws : 예외 발생 시 자신을 호출한 상위 메소드로 예외를 던짐(특정 상위 메소드에서 예외를 한 번에 처리하는 경우가 있을 수 있음, 계속 throws로 던질 경우 최종적으로 JVM이 처리를 하게 되지만, 권장하지 않음)
// 중요 : RuntimeException을 상속받은 Unchecked Exception의 경우 throws는 아무 의미 없음, throws는 Checked Exception의 처리 방법 중 하나
public void method1() throws Exception {
// 이 메소드를 호출한 부분의 catch문에 Exception에 대한 에외 처리가 있어야 함
throw new Exception("강제로 예외 발생"); // 모든 예외를 잡을 수 있는 Exception의 경우 throws Exception 필수
}
// RuntimeException을 상속받은 NullPointerException
public void method2() {
// 이 메소드를 호출한 부분의 catch문에 Exception 또는 NullPointerException에 대한 예외 처리가 있어야 함
throw new NullPointerException("강제로 NullPointerException 발생"); // NullPointerException 발생
}
// RuntimeException을 상속받은 ArithmeticException
public void method3() {
// 이 메소드를 호출한 부분의 catch문에 Exception 또는 ArithmeticException에 대한 예외 처리가 있어야 함
System.out.println(3 / 0); // ArithmeticException 발생
}
// RuntimeException을 상속받은 NullPointerException 발생이므로 throws는 아무 의미 없음
public void method4() throws ArithmeticException {
throw new NullPointerException("강제로 NullPointerException 발생"); // NullPointerException 발생
}
// RuntimeException을 상속받은 NullPointerException 발생이므로 throws는 아무 의미 없음
public void method5() throws ArithmeticException {
String name = null;
System.out.println(name.length());
}
// ArithmeticException : 어떤 수를 0으로 나눌 때 발생(RuntimeException 상속)
// NullPointerException : NULL 객체를 참조할 때 발생(RuntimeException 상속)
// ClassCastException : 적절하지 못하게 클래스를 형 변환하는 경우 발생(RuntimeException 상속)
// NegativeArraySizeException : 배열의 크기가 음수 값인 경우 발생(RuntimeException 상속)
// IndexOutOfBoundsException : 리스트형 객체에서 선언되지 않은 요소를 가져오려고 할 때 발생(RuntimeException 상속)
}
public class ExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String name = null;
ExceptionOccurred exceptionOccurred = new ExceptionOccurred();
try {
int nameLength = name.length(); // 1. NullPointerException에 걸리고 finally 실행
int num = 3 / 0; // 2. 코드 1이 없다면 ArithmeticException에 걸리고 finally 실행
exceptionOccurred.method2(); // 3. 코드 1, 2가 없다면 NullPointerException에 걸리고 finally 실행
exceptionOccurred.method3(); // 4. 코드 1, 2, 3이 없다면 ArithmeticException에 걸리고 finally 실행
} catch (NullPointerException e) {
System.out.println("NullPointerException : " + e.getMessage());
} catch (ArithmeticException e1) {
System.out.println("ArithmeticException : " + e1.getMessage());
} catch (Exception e) { // try문 실행에서 발생하는 예외 중 NullPointerException, ArithmeticException 외의 예외는 이곳에 걸림
System.out.println("Exception : 모든 예외를 잡을 수 있음");
} finally { // 무조건 실행시킬 코드를 적는 부분
System.out.println("무조건 실행되는 부분");
}
try {
int nameLength = name.length(); // 1. Exception에 걸리고 finally 실행
int num = 3 / 0; // 2. 코드 1이 없다면 Exception에 걸리고 finally 실행
exceptionOccurred.method1(); // 3. 코드 1, 2가 없다면 Exception에 걸리고 finally 실행
throw new Exception("강제 예외 발생"); // 4. 코드 1, 2, 3이 없다면 Exception에 걸리고 finally 실행
// exceptionOccurred.method2(); // 5. 코드 1, 2, 3, 4가 없다면 Exception에 걸리고 finally 실행
// exceptionOccurred.method3(); // 6. 코드 1, 2, 3, 4, 5가 없다면 Exception에 걸리고 finally 실행
} catch (Exception e) { // try문 실행에서 발생하는 모든 예외를 잡을 수 있지만, 어떤 문제로 발생하는 예외인지 확인이 불가하다는 단점이 있다.
System.out.println("Exception : 모든 예외를 잡을 수 있음");
} finally { // 무조건 실행시킬 코드를 적는 부분
System.out.println("무조건 실행되는 부분");
}
}
}
Checked Exception : RuntimeException을 상속받지 않은 클래스
Unchecked Exception : RuntimeException을 상속받은 클래스
throw : 강제로 예외를 발생시킬 수 있음 단, 발생시킨 예외를 catch문에서 잡을 수 있는 처리가 되어있지 않으면 오류 발생(catch문의 Exception은 모든 예외를 잡을 수 있음)
throws : 예외 발생 시 자신을 호출한 상위 메소드로 예외를 던짐(특정 상위 메소드에서 예외를 한 번에 처리하는 경우가 있을 수 있음, 계속 throws로 던질 경우 최종적으로 JVM이 처리를 하게 되지만, 권장하지 않음)
중요 : RuntimeException을 상속받은 Unchecked Exception의 경우 throws는 아무 의미 없음
throws는 Checked Exception의 처리 방법 중 하나
'Java > 참고자료' 카테고리의 다른 글
[Java] Annotation (0) | 2023.08.15 |
---|---|
[Java] Equals & HashCode (0) | 2022.11.25 |
[Java] Comparable & Comparator (0) | 2022.11.25 |
[Java] 연산자 (0) | 2022.11.25 |
[Java] Stack, Queue, Deque (0) | 2022.11.25 |