코드 실행 관점
.java 파일을 .class 파일로 컴파일 할 때 발생하는 에러
대부분 문법적인 오류로 인해서 발생한다.
예를 들어서 있지도 않은 클래스를 호출하거나, 접근 불가능한 메서드에 접근한다거나..
컴파일 에러가 발생할 경우 문법에 맞게 다시 작성하면 된다.
아주 좋은 예외 (바로 알 수 있기 때문이다.)
문법적인 오류가 아니라서, 실행 도중 발생하는 에러이다.
예외(Exception)처리 등을 통해 에러를 해결할 수 있다.
자바 프로그래밍에서는 실행 시 발생할 수 있는 오류를 '에러(error)' 와 '예외(exception)' 두가지로 구분하였다.
에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외 : 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
에러는 메모리 부족(OutOfMemoryError)이거나 스택 오버플로우(StackOverflowError) 와 같이 발생하게 된다면 심각한 오류이고 예측이 불가능하다.
JVM 실행에 문제가 생겼기 때문에 개발자가 대처할 방법이 없다.
하지만 예외의 경우 개발자가 대처할 방법이 있다.
그러한 예외에 대해 개발자가 구현한 로직에서 대응 코드를 미리 작성하면 된다.
그 대응 코드 가 바로 try-catch(예외 처리 문법) 이다.
일단, 해당 코드를 작성하고 이 코드가 위험한지 체크를 해줘야한다. (미리 대응)
try {
// 코드 작성
} catch( ) {
// 코드 작성
}
try 문 안에 실행 할 로직을 작성해준다.
이 로직 안에는 예외가 발생할 수 있는 코드가 포함되어 있다.
만약 예외가 발생하게 된다면 그 이후로 로직은 더이상 수행되지 않으며, catch 문을 통해서 로직이 수행된다.
일단 이 위험 코드를 알리기 위해서 throw, throws에 대해 알아보자.
기능 | 설명 |
---|---|
throws | 메서드 이름 뒤에 붙어 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어 |
throw | 메서드 안에서, 실제로 예외 객체를 던질때 사용하는 예약어 |
오류와 예외 모두 자바의 최상위 클래스인 Object를 상속 받는다.
그리고 그 사이에는 Throwable 클래스와 상속관계가 있는데, Throwable 클래스의 역할은 오류나 예외에 대한 메세지를 담는 것이다.
대표적으로 getMessage() , printStackTrace() 메서드가 이 클래스에 속해있다.
시작은 모든 객체의 최상위 클래스인 Object에서 시작한다.
Throwable 클래스는 Object 클래스를 상속한다.
Throwable 클래스의 자식으로 앞서 배운 Error(에러)와 Exception(예외) 클래스가 있다.
그러한 Exception(예외) 클래스에는 IOException와 RuntimeException이 있다.
Exception 및 하위 클래스 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 컴파일시 발생하는 예외
존재하지 않는 파일의 이름을 입력 (FileNotFoundException)
실수로 클래스의 이름을 잘못 기재 (ClassNotFoundException)
입력한 데이터 형식이 잘못된 경우 (DataFormatException)
RuntimeException 클래스 : 프로그래머의 실수로 발생하는 예외
배열의 범위를 벗어남 (IndexOutOfBoundsException)
값이 null인 참조 변수의 멤버를 호출 (NullPointerException)
클래스 간의 형 변환을 잘못함 (ClassCastException)
정수를 0으로 나누는 산술 오류 (ArithmeticException)
위에서 예외(Exception)는 컴파일 에러와 런타임 에러로 구분된다고 하였다.
그런데 또 다시 예외의 종류로 Check Exception / Unchecked Exception으로 나뉜다.
쉽게 말하면, Check Exception은 컴파일 예외 클래스들을 의미하고 , Unchecked Exception은 런타임 예외 클래스들을 의미한다고 보면 된다.
이렇게 나눈 이유에 대해서는 코드적 관점에서 예외 처리 동작을 필수 지정 유무에 따라 나뉘기 때문이다.
(공백) | Check Exception | Unchecked Exception |
---|---|---|
처리여부 | 반드시 예외처리를 해야한다 | 명시적인 처리를 안해도 된다. |
확인시점 | 컴파일 단계 | 런타임 단계 |
예외 종류 | RuntimeException을 제외한 Exception 클래스와 하위 예외 클래스 | RuntimeException과 그 하위 예외 클래스 |