예외와 에러의 차이점
에러: 자바 가상 머신 자체에서 발생하는 오류로, 개발자가 해결할 수 없는 오류
예외 : 연산 오류, 숫자 오류 등과 같이 상황에 따라 개발자가 해결할 수 있는 오류
개발자가 예외 처리하면 프로그램은 종료되지 않고 계속 실행된다.
Error 클래스와 Exception 클래스는 모두 Throwble 클래스를 상속하고 있다.
Exception은 RuntimeException을 상속한 클래스인 Unchecked Exception, 상속하지 않은 클래스인 Checked Exception으로 분류할 수 있다.
Checked Exception
컴파일 전에 예외 발생 문법을 검사하고, 예외 처리를 하지 않으면 문법 오류가 발생해 컴파일 자체가 불가능하다.
반드시 try ~ catch로 예외를 잡거나 throw로 호출한 메소드에게 예외를 던져야 한다.
ex) InterruptedException, ClassNotFoundException, IOException, FileNotFoundException, CloneNotSupportedException
Unchecked Exception
RuntimeException 클래스를 상속받는다.
컴파일전이 아니라 실행할 때 예외가 발생한다.
예외 처리를 따로 하지 않더라도 문법 오류가 발생하지 않는다.
그렇기 때문에 예외 처리 없이 컴파일과 실행이 가능하지만, 실행 중 실행 예외가 발생하면 프로그램은 강제 종료된다.
ex) ArithmeticException, ClassCastException, ArrayIndexOutOfBoundsException, NumberFormatException, NullPointerException
예외 처리 과정
try{ // 일반 예외, 실행 예외 발생 가능 코드
System.out.println(3/0);
}catch(ArithmeticException e){ // 예외가 발생했을 때 처리
System.out.println("숫자는 0으로 나눌 수 없습니다.");
}finally { // 예외 발생 여부에 상관없이 무조건 실행
System.out.println("프로그램 종료");
}
숫자는 0으로 나눌 수 없습니다.
프로그램 종료
먼저 try 구문이 실행된다. 만약 예외가 발생하지 않으면 catch() 블록은 실행되지 않고, finally 블록이 실행된다.
만일 예외가 발생하면 자바 가상머신이 가장 먼저 인지한다.
JVM은 발생한 예외 타입의 객체를 생성해 catch(){} 블록의 매개변수로 전달한다.
위 코드에서는 ArithmeticException이 발생하면 JVM은 ArithmeticException 객체를 생성하고, 생성 객체를 catch() 블록의 매개변수로 전달하는 것이다.
만일 해당 객체를 받을 catch(){}블록이 존재하지 않으면 예외 처리가 되지 않아 프로그램이 강제 종료된다.
참고
Do it 자바 책
'BACK > JAVA' 카테고리의 다른 글
[JAVA] 쓰레드 생성 및 실행(Thread클래스, Runnable 인터페이스) (0) | 2022.08.08 |
---|---|
[JAVA] 추상 클래스 (특징, 객체 생성 방법) (0) | 2022.08.04 |
[JAVA] 이너 클래스(인스턴스, 정적, 지역) (0) | 2022.07.28 |
[JAVA] 이너 인터페이스 (0) | 2022.07.28 |
[JAVA] 인터페이스, 디폴트 메서드 (0) | 2022.07.28 |