9주차 과제: 예외 처리
목표
자바의 예외 처리에 대해 학습하세요.
학습할 것 (필수)
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
- 자바가 제공하는 예외 계층 구조
- Exception과 Error의 차이는?
- RuntimeException과 RE가 아닌 것의 차이는?
- 커스텀한 예외 만드는 방법
자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try ~ catch
try{
//에러가 발생할 수 있는 코드
}catch (Exception e) {
//에러 시 수행
}finally{
//무조건 수행
}
- try블록에는 에러가 발생할 수 있는 코드가 위치한다.
- try블록에 있는 코드가 예외가 발생하지 않으면 catch블록의 코드는 실행되지 않고 finally블록의 코드를 실행
- 예외가 발생한다면, catch블록의 코드가 실행되고 finally블록의 코드가 실행된다.
- finally블록은 생략가능하다.
throw
직접적으로 예외를 발생시킬 때 사용.
public static void main(String[] args) {
throw new Exception(); // 강제 예외 발생
}
throws (예외 떠넘기기)
메서드 내부에서 예외가 발생 했을 때 예외를 try-catch문으로 잡아서 처리할 수 있지만,
경우에 따라서 현재 메소드를 호출한 메소드로 예외를 떠넘길 수 있다.
throws 키워드는 메소드 선언부 끝에 작성되어 메소드를 처리하지 않은 예외를 호출한 곳으로
떠넘기는 역할을 한다.
public void exception() throws NullPointerException{
}
//여러개의 예외 클래스 사용
public void exception2() throws IOException, NullPointException{
}
만약 모든 메서드에서 throws 를 이용해 예외를 떠넘기다 보면 최초 호출 지점인 main() 메서드 내부로 예외가 던져지게 되며 main() 메서드에서 마저 예외를 떠넘기게 된다면 JVM의 예외처리기까지 도달하여 프로그램은 그대로 종료된다.
이렇게 되면 사실상 예외를 처리하지 않은것이나 다름 없으므로 매우 무의미한 행동이기 때문에 의도적인 경우가 아니라면 throws는 많은 생각과 필요에 의해 사용되어야 한다.
예외를 떠넘기는 이유
- 메서드 선언부에 선언된 throws문을 통해 해당 API를 사용했을 때 어떤 예외가 발생할 수 있는지를 예측할 수 있다.
- 현재 메서드 내에서 예외를 처리할 필요가 없다고 판단했을 경우
자바가 제공하는 예외 계층 구조
체크 예외(checked Exception)
RuntimeException을 상속하지 않는 예외들을 말한다.
예외 처리 코드를 컴파일러가 체크한다.
코드상의 문제가 아니라 실행상황에 따라 발생가능성 있는 예외
체크 예외가 발생할 수 있는 메소드를 사용할 경우, 복구가 가능한 예외들이기 때문에 반드시 예외처리를 해야한다.
이때 해결하지 않으면 컴파일 시 체크 예외가 발생한다. 체크 예외는 Java컴파일러와 JVM이 규칙을 준수하는지 확인하기 떄문에 Exception이 호출된다.
언체크 예외(unchecked Exception)
RuntimeException을 상속한 예외들을 말한다.
Code를 잘못 만들어서 생기는 예외
언체크예외라고 불리는 이유는 명시적으로 예외처리를 강제하지 않기 때문.
프로그램에 오류가 있을 때 발생하도록 의도된 것.
Exception과 Error의 차이는?
에러(Error)
개발자가 해결할 수 없는 치명적인 오류
하드웨어의 잘못된 동작 또는 고장으로 인한 오류
에러가 발생되면 프로그램 종료
정상 실행 상태로 돌아갈 수 없음
예외(Exception)
개발자가 해결할 수 있는 오류
사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
예외가 발생되면 프로그램 종료
예외 저리 추가하면 정상 실행 상태로 돌아갈 수 있음
예외가 발생하면 비정상적인 종료를 막고, 프로그램을 계속 진행할 수 있도록 우회 경로를 제공하는 것이 바람직.
RuntimeException과 RE가 아닌 것의 차이는?
컴파일 시의 예외처리체크를 하느냐 안하느냐의 차이다.
컴파일러는 RuntimeException을 제외한 모든 Exception 클래스들을 컴파일시 예외처리( try - catch )를 했는지 반드시 확인 한다. 하지만 RuntimeException 클래스 부류가 발생했을 때는 ( try - catch )를 사용하지 않더라도 컴파일까지는 가능하다.
RuntimeException은 try - catch 가 사용되었는지 확인을 하지 않는 이유
그이유는 RuntimeException에 속하는 클래스들은 주로 개발자의 실수에 의해 발생되는 예외들이 많다.
이런 것들은 개발자가 조금만 더 신경쓰면 예외가 발생하지 않게끔 해줄수 있기에 컴파일러가 확인하지 않게 되었다라고 볼수도 있다
커스텀한 예외 만드는 방법
사용자 정의 예외 클래스는 컴파일러가 체크하는 일반 예외로 선언할 수도 있고, 컴파일러가 체크하지 않는 실행 예외로 선언할 수도 있다. 일반 예외로 선언할 경우 Exception을 상속하면 되고 실행 예외로 선언할 경우에는 RuntimeException을 상속하면 된다.
public class ExceptionTest extends Exception{
public ExceptionTest() {};
public ExceptionTest(String message){
super(message);
}
}
참조 출처
'Development > 백기선님의 온라인 자바 스터디' 카테고리의 다른 글
11주차 과제: Enum (0) | 2021.10.24 |
---|---|
10주차 과제: 멀티쓰레드 프로그래밍 (0) | 2021.10.14 |
7주차 과제: 패키지(미완) (0) | 2021.01.28 |
8주자 과제: 인터페이스 (0) | 2021.01.28 |
6주차 과제: 상속 (0) | 2021.01.27 |