예외와 에러의 차이점
예외: 개발자가 처리할 수 있는 오류
에러: 개발자가 처리할 수 없는 오류
자바에서 예외의 최상위 클래스는 Excetpion클래스, 에러의 최상위 클래스는 Error클래스다.
이 2개의 클래스는 모두 Throwable클래스를 상속하고 있다. 따라서 에러와 예외 모두 Throwable클래스의 모든 기능을 포함한다.
예외 클래스의 상속 구조
Throwable클래스를 상속받은 Exception클래스는 다시 일반 예외 클래스(Checked Exception)와 실행 예외 클래스(Unchecked(runtime) exception)로 나뉜다.
Exception 클래스에게서 직접 상속 받은 예외 클래스들이 처리하는 일반 예외는 컴파일 전에 예외 발생 문법을 검사하며, 예외 처리를 하지 않으면 문법 오류가 발생한다.
반면에, RuntimeException클래스를 상속받은 예외 클래스들이 처리하는 실행 예외는 컴파일전이 아니라 실행할 때 발생하는 예외로, 예외 처리를 따로 하지 않더라도 문법 오류가 발생하지 않는다. 다만 프로그램 실행 시 프로그램이 강제 종료되는 이유는 대부분 실행예외 때문이다.
일반 예외 클래스 예제
import java.io.FileInputStream;
import java.io.InputStreamReader;
class A implements Cloneable{
protected Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
public class CheckException {
public static void main(String[] args) {
// 1.InterruptedException
Thread.sleep(1000);
// 2.ClassNotFoundException
Class cls = Class.forName("java.lang.object");
// 3.IOException
InputStreamReader in = new InputStreamReader(System.in);
in.read();
// 4.FileNotFoundException
FileInputStream fis = new FileInputStream("text.txt");
// 5.CloneNotSuppetedException
A a1 = new A();
A a2 = (A)a1.clone();
}
}
// 문법 오류로 실행 불가
실행 예외
class A{}
class B extends A{}
public class UncheckedException {
public static void main(String[] args) {
// UncheckedException = RuntimeException(실행 예외)
//1.ArithmeticException
System.out.println(3/0);
//2.classCastException
A a = new A();
B b = (B)a;
//3.ArrayIndexOutOfBoundsException
int[] array = {1,2,3};
System.out.println(array[3]);
//4.NumberFormatException
int num = Integer.parseInt("10!");
//5.NullPointException
String str1 = null;
System.out.println(str1.charAt(2));
}
}
예외 처리 문법
try{
//일반예외, 실행예외 발생 가능 코드
} catch (예외 클래스명 참조 변수명) {
//예외가 발생했을 때 처리
} finally {
// 에외 발생 여부에 상관없이 무조건 실행 (생략가능)
}
try-cathc구문과 try-catch-finally 구문의 동작 비교
public class TryCatchFinally {
public static void main(String[] args) {
//1.try-catch
try{
System.out.println(3/0);
System.out.println("프로그램 종료");
} catch (ArithmeticException e) {
System.out.println("숫자는 0으로 나눌 수 없습니다");
System.out.println("프로그램 종료");
}
//2.try-catch-finally
try{
System.out.println(3/0);
}catch (ArithmeticException e){
System.out.println("숫자는 0으로 나눌 수 없습니다");
} finally {
System.out.println("프로그램 종료");
}
}
}
예외 처리 과정
try{
System.out.println(3/0); //1 -> 2
}catch (ArithmeticException e){ // 3
System.out.println("숫자는 0으로 나눌 수 없습니다");
} finally {
System.out.println("프로그램 종료");
}
- 예외 발생
- JVM / 발생한 예외 클래스 객체 생성(ArithmeticException excep = new ArithmeticException)
- catch 블록으로 전달
다중 예외 처리
catch 블록도 예외 타입에 따라 여러개를 포함할 수 있다.
try{
} catch (예외 타입 e1){
} catch (예외 타입 e2){
} finally {
}
EX)
public class MultiCatch_1 {
public static void main(String[] args) {
// 단일 try-catch
try{
System.out.println(3/0);
} catch(ArithmeticException e) {
System.out.println("숫자는 0으로 나눌 수 없습니다.");
}finally {
System.out.println("프로그램 종료");
}
try{
int num = Integer.parseInt("10A");
}catch (NumberFormatException e) {
System.out.println("숫자로 바꿀 수 없습니다");
}finally {
System.out.println("프로그램종료");
}
System.out.println();
//다중 try-catch
try{
System.out.println(3/0);
int num = Integer.parseInt("10A");
} catch(ArithmeticException e) {
System.out.println("숫자는 0으로 나눌 수 없습니다.");
} catch (NumberFormatException e){
System.out.println("숫자로 바꿀 수 없습니다");
} finally {
System.out.println("프로그램 종료");
}
}
}
다중 예외 처리구문을 작성시 주의해야 할 사항은 try{}블록에서 예외가 발생하고, 여러개의 catch(){}블록이 있을 때 실행할 catch(){}블록의 선택과정은 항상 위에 확인한다는 것이다
(if-else if-else문을 생각해보자)
다중 예외를 한 블록에서 처리
try{
} catch (예외 타입1 | 예외타입2 참조변수명){
} finally {
}
OR연산자를 이용하면 하나의 catch(){}블록에서 2개이상의 예외를 처리할 수 있다.
public class MultiCatch_3 {
public static void main(String[] args) {
// 1.catch 블록을 각각 처리했을 때
try{
System.out.println(3/1);
int num = Integer.parseInt("10A");
} catch (ArithmeticException e) {
System.out.println("예외가 발생했습니다");
} catch (NumberFormatException e) {
System.out.println("예외가 발생하였습니다.");
}
// 2.catch 블록을 하나로 통합했을 때
try{
System.out.println(3/1);
int num = Integer.parseInt("10A");
} catch (ArithmeticException | NumberFormatException e){
System.out.println("예외가 발생했습니다");
}
}
}
'Language > Java' 카테고리의 다른 글
[Java] 예외 전가 (throws) (0) | 2022.04.05 |
---|---|
[Java] 리소스 자동 해제 예외 처리 (0) | 2022.04.04 |
[Java] 이너 인터페이스 (0) | 2022.04.03 |
[Java] 인터페이스 타입의 입력 매개변수 전달 (0) | 2022.04.03 |
[Java] 익명 클래스, 익명 이너 클래스 (0) | 2022.04.03 |