1. 예외 발생시키기
키워드 throw를 사용하면 프로그래머가 고의로 예외를 발생시킬 수 있으며, 방법은 아래의 순서를 따른다.
1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.
Exception e = new Exception("예외 발생");
2. 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
객체만 생성해서는 예외를 발생시키지 않으므로 반드시 throw를 써줘야 한다. 이 때 Exception 인스턴스를 생성할 때
위와 같이, 생성자에 String을 넣어주면, 이 String이 Exception 인스턴스에 메시지로 저장된다. 이 메시지는 getMessage()를
이용해서 얻을 수 있다.
2. checked 예외, unchecked 예외
(1) checked 예외 예제
위 예제와 같이 Exception 클래스와 그 자손들은 checked 예외 이기 때문에 예외처리를 해주지 않으면 컴파일 조차 되지 않는다.
(2) unchecked 예외 예제
위 예제는 예외처리를 하지 않았음에도 불구하고 이전 옞[와 달리 성공적으로 컴파일 될 것이다. 그러나 실행하면 위 실행결과처럼
RuntimeException이 발생하여 비정상적으로 종료될 것이다. 이 예제가 명백히 RuntimeException을 발생시키는 코드를 가지고 있고.
이에 대한 예외처리를 하지 않았음에도 컴파일 되었다. 그 이유는 RuntimeException 클래스와 그 자손은 unchecked에 해당되는 예외
인데, 이 예외는 프로그래머가 실수로 발생하는 것들이기 때문에 예외처리를 강제하지 않는 것이다.
3. 메서드에 예외 선언하기
예외를 처리하는 방법에는 지금까지 배우 try - catch 문을 사용하는 것 외에 , 예외를 메서드에 선언하는 방법이 있다.
메서드에 예외를 선언하려면, 메서드의 선언부에 키워드 throws (throw와 다름) 를 사용해서 메서드 내에서 발생할 수 있는
예외를 적어주기만 하면 된다. 그리고 예외가 여러 개일 경우에는 쉼표(,)로 구분한다.
void method() throws Exception1, Exception 2, ... Exception N {
// 메서드의 내용
}
만일 아래와 같이 모든 예외의 최고조상인 Exception클래스를 메서드에 선언하면, 이메서드는 모든 종류의 예외가 발생할 가능성이
있다는 뜻이다. 메서드의 선언부에 예외를 선언함으로써 메서드를 사용하려는 사람이 메서드의 선언부를 보았을 때, 이 메서드를 사용하기
위해서는 어떠한 예외들이 처리되어져야 하는지 쉽게 알 수 있다.
위 예제를 보면 , method2() 에서 'throw new Exception();' 문장에 의해 예외가 강제적으로 발생했으나, try -catch 문으로
예외처리를 해주지 않았으므로, method2()는 종료되면서 예외를 자신을 호출한 method1() 에게 넘겨준다. method1()에서도
역시 예외처리를 해주지 않았으므로 종료되면서 main 메서드에게 예외를 넘겨준다.
그러나 main 메서드에서 조차 예외처리를 해주지 않았으므로 main 메서드가 종료되어 프로그램이 예외로 인해 비정상적으로
종료되는 것을 볼 수 있다.
이처럼 예외가 발생한 메서드에서 예외처리를 하지 않고 자신을 호출한 메서드에게 예외를 넘겨줄 수는 있지만, 이것으로
예외가 처리된 것은 아니고 예외를 단순히 전달만 하는것이다. 결국 어느 한 곳에서는 반드시 try-catch문으로 예외처리를
해주어야 한다.
4. finally 블럭
finally블럭은 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다. try-catch문의 끝에 선택적으로
덧붙여 사용할 수 있으며, try-catch-finally로 구성된다.
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
// 예외처리를 위한 문장을 적는다.
} finally {
// 예외의 발생여부에 관계없이 항상 수행되어야하는 문장들을 넣는다.
// finally블럭은 try-catch문의 맨 마지막에 위치해야한다.
}
예외가 발생한 경우에는 'try-catch-finally'의 순으로 실행되고 , 발생하지 않은 경우에는 'try-finally' 순으로 실행된다.
try {
startInstall();
copyFiles();
deleteTempFiles();
} catch (Exception e) {
e.printStackTrace();
deleteTempFiles();
} // try-catch의 끝
아래와 같이 프로그램을 설치하는 코드가 있을 때, 설치를 정상적으로 마쳐도 임시파일을 삭제해야 하고 중간에 예외가 발생해도
임시파일을 삭제해야 한다면 위와 같이 try블럭과 catch블럭에 같은 코드를 넣기보다는 아래와 같이 finally에 넣는 것이 낫다.
try {
startInstall();
copyFiles();
} catch (Exception e) {
e.printStackTrace();
} finally {
deleteTempFiles();
} // try-catch의 끝
'JAVA의 정석' 카테고리의 다른 글
Object 클래스 (1) | 2024.02.16 |
---|---|
예외 처리(4) - 사용자 정의 예외 만들기, 연결된 예외 (0) | 2024.01.29 |
예외 처리(2) - try-catch의 흐름, 멀티 catch블럭 (2) | 2024.01.28 |
예외 처리(1) - 정의와 구조 (1) | 2024.01.28 |
익명 클래스 (anonymous class) (1) | 2024.01.28 |