728x90
반응형
1. 자바에서 예외 처리 방법
자바에서 예외 처리란, 프로그램 실행 중 발생할 수 있는 예기치 못한 예외 발생에 대비한 코드를 작성하는 것이며, 예외 처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상 종료를 막고 실행 상태를 유지할 수 있도록 함
예외 처리(Exception Handling) 정의: 프로그램 실행 시 발생할 수 있는 예외 발생에 대비한 코드를 작성하는 것 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행 상태를 유지하는 것
자바의 예외 처리는
- 예외가 발생한 메소드 내에서 직접 처리하는 방법
- 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법
- 사용자 정의 예외를 생성해서 처리하는 방법
1. 예외가 발생한 메소드 내에서 직접 처리 (try - catch - finally)
try {
예외 발생 가능성이 있는 문장들;
}catch(예외 타입1 매개변수명) {
예외타입1의 예외가 발생할 경우 처리 문장들;
}catch(예외 타입2 매개변수명) {
예외타입2의 예외가 발생할 경우 처리 문장들;
}finally {
항상 수행할 필요가 있는 문장들;
}
- try 블록은 예외가 발생할 가능성이 있는 범위를 지정하는 블록으로, 최소한 하나의 catch 블록이 있어야 함
- catch 블록의 매개변수는 예외 객체가 발생했을 때 참조하는 변수명으로 반드시 java.lang.Throwable 클래스의 하위 클래스 타입으로 선언되어야 함
- 지정된 타입의 예외 객체가 발생하면 try 블록의 나머지 문장들은 수행되지 않고, 자바 가상 머신은 발생한 예외 객체를 발생시키며 발생한 예외 객체 타입이 동일한 catch 블록을 수행함
- finally 블록은 필수 블록은 아니지만 이 블록의 내용은 예외 발생 유무나 예외 catch 유무와 상관없이 무조건 수행됨
2. 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘기는 방법 (throws)
- try-catch-finally 블록을 이용하여 직접 처리하지 않아도 예외가 발생한 메소드를 호출한 지점으로 예외를 전달하여 처리하는 방법이 있음
- 이때 사용하는 예약어가 throws
- 어떠한 메소드의 내부 소스 코드에서 에러가 발생했을 때 이 메소드를 사용하는 곳으로 책임을 전가하는 행위
public class ExceptionTest {
static void callDriver() throws ClassNotFoundException {
Class.forName("oracle.jdbc.driver.OracleDriver");
System.out.println("완료");
}
public static void main(String[] args) {
try {
callDriver();
}catch (ClassNotFoundException e) {
System.out.println("클래스를 찾을 수 없습니다.");
}catch (Exception e) {
System.out.println(e.getMessage());
}finally {
System.out.println("시스템 종료");
}
}
}
- 결과
클래스를 찾을 수 없습니다.
시스템 종료
- mail에서 callDriver() 메서드 실행
- callDriver() 메서드에서 oracle.jdbc.driver.OracleDriver 클래스를 가져옴
- 해당 클래스를 찾지 못하면 ClassNotFoundException 이 발생하는데 callDriver()에서는 throws ClassNotFoundException 처리로 호출한 main에 예외를 넘김
- main에서는 ClassNotFoundException을 받아 catch문에서 잡아서 “클래스를 찾을 수 없습니다.” 메시지를 출력함
- 마지막으로 finally가 실행되면 “시스템 종료”를 출력함
3. 사용자 정의 예외 생성 (throw)
- 기존의 예외 클래스로 예외를 처리할 수 없다면 사용자가 직접 예외 클래스를 작성해서 발생시킬 수 있음
- 사용자가 예외 클래스를 직접 정의하려면 예외 클래스의 최상위 클래스인 java.lang.Exception 클래스를 상속받아 클래스를 정의함
class {예외클래스이름} extends Exception {
// ex)
public class MyException extends Exception {
public MyException() {
super("사용자 정의 예외");
}
}
- 자바 가상 머신은 프로그램 수행 중에 예외가 발생하면 자동으로 해당하는 예외 객체를 발생시킨 다음 catch블록을 수행함
- 하지만 예외는 사용자가 강제적으로 발생시킬 수 있음
- 예외를 발생시키기 위해 throw 예약어 사용
throw new {예외클래스이름}(매개변수);
- throw를 이용한 예외 발생 시에도 try-catch-finally 구문을 이용한 예외 처리를 하거나, throws를 이용해 예외가 발생한 메소드를 호출한 다른 메소드를 넘기는 예외 처리 방법을 사용해야 함
2. 자바가 제공하는 예외 계층 구조
- 자바에서 Exception은 checked, unchecked 두 가지로 나눌 수 있음
체크 예외(Checked Exception)
- 실행하기 전에 예측 가능한 예외들을 말하는데, 체크 예외가 발생할 수 있는 메소드를 사용할 경우 복구가 가능한 예외들이기 때문에 반드시 예외를 처리하는 코드를 작성해야 함
- catch문으로 예외를 잡거나, throws로 자신이 호출한 클래스로 예외를 던지를 방법으로 해결해야 함
- ex) IOException, SQLExceptiopn
언체크 예외(Unchecked Exception)
- 실행하고 난 후에 알 수 있는 예외들을 말하는데, 언체크 예외라고 불리는 이유는 명시적으로 예외 처리를 강제하지 않기 때문임
- 언체크 예외는 따로 catch문으로 예외를 잡거나, throws로 선언하지 않아도 됨
- 프로그램에 오류가 있을 때 발생하도록 의도된 것임
- ex) NullPointerException, ArrayIndexOutOfBoundException
3. Exception과 Error 차이는?
- Error는 실행 중 일어날 수 있는 치명적 오류, 컴파일 시점에 체크할 수 없고 오류가 발생하면 프로그램은 비정상 종료됨
- Exception은 Error보다 비교적 경미한 오류, try-catch를 이용해 프로그램의 비정상적인 종료를 박을 수 있음
- Error는 런타임에서 실행 시 발생되면 전부 예측 불가능한 Unchecked Error에 속함
- Exception과 다르게 에러가 발생할 경우 코드를 고치지 않고서는 해결이 불가능함
728x90
반응형
댓글