목표
자바의 예외 처리에 대해 학습하세요.
학습할 것 (필수)
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
- 자바가 제공하는 예외 계층 구조
- Exception과 Error의 차이는?
- RuntimeException과 RE가 아닌 것의 차이는?
- 커스텀한 예외 만드는 방법
예외처리란?
- 프로그램 실행 시 발생할 수 있는 예외에 대비한 코드를 작성하는 것이다.
- 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것이 목표이다.
- 처리되지 못한 예외가 발생하면 프로그램은 비정상적으로 종료된다.
- 처리되지 못한 예뇌는 JVM의 예외처리기가 받아서 예외 원인을 화면에 출력한다.
자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try-catch
- 하나의 try블럭 다음에는 하나 이상의 catch블록이 올 수 있다.
- 발생한 예외의 종류와 일치하는 단 한개의 catch블록만 수행된다.
- 발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.
try-catch문에서의 흐름
- try블럭 내에서 예외가 발생한 경우
- 발생한 예외와 일치하는 catch블록을 찾는다.
- 일치하는 catch블럭을 찾게 되면, 해당 블록 내이 문장들을 수행하고 전체 try-catch문을 빠져나간다.
- 예외가 발생하지 않을 경우
- catch블럭은 수행되지 않는다.
try{
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
}
catch(ArithmeticException e1){
// ArithmeticException이 발생했을 경우, 처리하는 문장을 작성한다.
}
catch(Exception e2){
// ArithmeticException을 제외한 모든 예외가 발생했을 경우, 처리하는 문장을 작성한다.
}
모든 예외 클래스는 Exception 클래스의 자식이므로 catch의 예외 타입을 Exception으로 작성하면 모든 예외를 처리할 수 있다.
throw
throw 키워드를 사용하여 프로그래머가 고의로 예외를 발생시킬 수 있다.
try{
Exception e = new Exception("예외 발생!");
throw e;
}
catch(Exception e)
{
System.out.println("에러 메세지: " + e.getMessage());
}
--실행결과--
에러 메세지: 예외 발생!
Exception 인스턴스를 생성할 때, 생성자에 String을 넣어주면 이 String이 Exception 인스턴스에 메시지로 저장된다.
이러한 성격을 이용하여 자바에 정의되어있지 않은 케이스를 예외로 지정해 예외를 발생하고 메세지를 전달할 수 있다.
throws
thorws 키워드를 메서드 선언부에 작성함으로써 메서드 내에서 발생할 수 있는 예외를 선언할 수 있다. 여러 개의 예외를 선언하려면 쉼표(,)로 구분한다.
void method() throws Exception1, Exception2, ⋯ ExceptionN{
// 메서드 내부
}
메서드 선언부에 예외를 선언함으로써 이 메서드를 사용하기위해 어떠한 예외들이 처리되어야 하는지 쉽게 알 수 있다.
throsw Exception으로 선언할 경우 모든 종류의 예외가 발생할 가능성이 있다. (선언한 예외뿐 아니라 자식 타입의 예외도 발생할 수 있다는 뜻이다.)
이렇게 선언된 예외들은 해당 메서드에서 처리되는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡긴다.
예외를 전달받은 메서드가 또다시 자신을 호출한 메서드에게 전달할 수 있드며, 이런 식으로 계속 전달되다 마지막 main메서드에서도 예외가 처리되지 않으면 프로그램 전체가 종료된다.
finally
try-catch문의 끝에 선택적으로 덧붙일 수 있드며, 예외의 발생 여부와 상관없이 실행되어야 할 코드를 포함한다.
try{
// 예외 발생 가능성이 있는 문장들..
}
catch (Exception1 e1){
// Exception1 발생 시 수행되는 문장들
}
finally{
// Exception1 발생과 상관없이 수행되는 문장들
// finally 블럭은 try-catch 문의 맨 마지막에 위치해야한다.
}
자바가 제공하는 예외 계층 구조
모든 예외의 최고 조상은 Exception 클래스이며 모든 클래스의 조상은 Object 클래스이므로 Exception클래스 역시 Object클래스의 자식 클래스이다.
위 그림과 같이 예외 클래스는 RuntimeException클래스와 RE가 아닌 것들로 나눌 수 있다.
둘의 차이점은 아래 RuntimeException과 RE가 아닌 것의 차이는?에서 설명하겠다.
Exception과 Error의 차이는?
Error | 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 |
Exception | 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 |
Error는 메모리 부족, 스택오버플로우와 같이 발생하면 복구할 수 없는 심각한 오류이므로 프로그램의 비정상적인 종료를 막을 수 없다.
Exception은 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 잆다.
RuntimeException과 RE가 아닌 것의 차이는?
RuntimeException | 프로그래머의 실수로 발생하는 예외 |
RE가 아닌 것들 | 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 |
RuntimeException클래스들은 주로 프로그래머의 실수에 의해 발생될 수 있는 예외이다.
RE가 아닌 클래스들은 주로 외부의 영향으로 발생할 수 있는 예외이다.
두 예외의 예시는 아래와 같다.
RuntimeException | ArrayIndexOutOfBoundsException | 배열의 범위를 벗어난 경우 |
NullPointerException | 값이 null인 참조 변수의 멤버를 호출 | |
ClassCastException | 클래스간 형변환을 잘못한 경우 | |
ArithmeticException | 정수를 0으로 나누려고 한 경우 | |
RE가 아닌 것들 | FileNotFoundException | 존재하지 않는 파일 이름을 입력한 경우 |
ClassNotFoundException | 클래스의 이름을 잘못 적은 경우 | |
DataFormatException | 입력한 데이터 형식이 잘못된 경우 |
커스텀한 예외 만드는 방법
기존의 정의된 예외 클래스 외에 필요에 따라 새로운 예외 클래스를 정의하여 사용할 수 있다.
Exception 클래스를 상속받거나 필요에 따라 알맞은 예외 클래스를 상속받아 만든다. 생성자와 멤버를 추가함으로써 예외를 원하는 방식으로 만들어 사용할 수 있다.
class NewException extends Exception {
NewException(String msg){
super(msg);
}
}
Reference)
자바의 정석 - 남궁 성
'IT > JAVA' 카테고리의 다른 글
자바 Enum - 백기선님 스터디 11주차 과제 (0) | 2021.04.02 |
---|---|
자바 멀티쓰레드 프로그래밍 - 백기선님 스터디 10주차 과제 (0) | 2021.03.29 |
자바 인터페이스 - 백기선님 스터디 8주차 과제 (0) | 2021.03.01 |
자바 패키지 - 백기선님 스터디 7주차 과제 (0) | 2021.02.26 |
자바 상속 - 백기선님 스터디 6주차 과제 (0) | 2021.02.19 |