예외 처리 코드
프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 예외 처리 코드라고 한다.
자바 컴파일러는 소스파일을 컴파일 할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일오를 발생시킨다.
그렇기 때문에 예외 처리코드를 작성해야한다.
예외처리 코드는 try - catch - finally 블럭을 이용한다. 생성자 내부와 메서드 내부에서 작성되어 일반 예외와 실행예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.
try{
예외 발생 가능 코드
} catch(예외클래스 e) {
예외 처리
} finally {
항상 실행;
}
try 블럭에는 예외 발생 가능 코드가 위치한다. try 블럭의 코드가 예외 발생없이 정상 실행되면 catch 블럭의 코드는 실행되지 않고 finally 블럭의 코드를 실행한다. 만약 try블럭의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블럭으로 이동하여 예외처리코드를 실행한다.
다중 catch
try 블록 내부는 다양한 종류의 예외가 발생할 수 있다. 발생되는 예외별로 예외 처리 코드를 다르게 하려면 다중 catch 블럭을 작성해야 한다. catch 블럭의 예외 클래스 타입은 try 블러겡서 발생된 예외의 종류를 말하는데 try 블럭에서 해당타입의 예외가 발생하면 catch 블럭을 실행하도록 되어있다.
catch 블럭이 여러개라 할지라도 단 하나의 catch 블럭만 실행된다. 그 이유는 try 블럭에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블럭으로 이동하기 때문이다.
catch 순서
다중 catch블럭을 작성 할 때 주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야한다.
try 블럭에서 예외가 발생했을 때, 예외를 처리해줄 catch 블럭은 위에서부터 차례대로 검색된다.
만약 상위 예외 클래스의 catch 블럭이 위에 있다면, 하위 예외 클래스의 catch 블럭은 실행되지 않는다.
ArrayIndexOutOfBoundException 이 발생하면 첫번쨰 catch 블럭을 실행하고 그 밖에 다른 예외가 발생하면 드 번째 catch 블럭을 실행한다.
예외 떠넘기기
메서드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try -catch 블럭으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메서드를 호출한 곳으로 예외를 떠넘길 수 있다.
이때 사용하는 것이 throws이다. throws 키워드는 메서드 선언부 끝에 작성되어 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다. throws 키워드 뒤에는 Exception 만으로 모든 예외를 간단히 넘길 수 있다.
리턴타입 메서드명(매개변수,..) throws Exception {
}
throws 키워드가 붙어있는 메서드는 반드시 try 블럭내애서 호출되어야 한다. 그리고 catch 블럭에서 떠넘겨 받은 예외를 처리해야한다.
public class ThrowsExample {
public static void main(String[] args){
try{
findClass();
} catch(ClassNotFoundException e){
System.out.println("클래스가 존재하지 않습니다.");
}
}
public static void findClass() throws ClassNotFoundException{
Class clazz = class.forName("java.lang.String2");
}
}
forName() 메서드를 호출할 때 try- catch 블럭으로 예외를 처리하거나, thows 로 예외를 떠넘겨야 한다.
main() 메서드에서도 thows 키워드를 사용해서 예외를 떠넘길 수 있는데, 결국 JVM 이 최종적으로 예외 처리를 하게 된다. JVM은 예외의 내용을 콘솔(Console)에 출력하는 것으로 예외 처리를 한다.
public static void main(String[] args) throws ClassNotFoundException {
findClass();
}
main() 메서드에서 throws Exception을 붙이는 것은 좋지 못한 예외 처리 방법이다. 프로그램 사용자는 프로그램이 알 수 없는 예외 내용을 출력하고 종료되는 것을 좋아하지 않는다. 그렇기 때문에 main() 에서 try-catch블럭으로 예외를 최종처리하는 것이 바람직하다.
사용자 정의 예외 클래스 선언
사용자 정의 예외클래스는 컴파일러가 체크하는 일반 예외로 선언할 수도 있고, 컴파일러가 체크하지 않는 실행 예외로 선언 할 수도 있다. 일반 예외로 선언할 경우 Exception을 상속하면 되고, 실행 예외로 선언할 경우에는 RuntimeException을 상속하면 된다.
public class
'java' 카테고리의 다른 글
java_13_컬렉션 프레임워크 (0) | 2021.10.26 |
---|---|
java_13_java.lang과 java.util 패키지 & toString(), equals() (0) | 2021.10.26 |
java_3_반복문(for문, while문, do-while문) (0) | 2021.10.23 |
java_12_예외처리 (0) | 2021.10.22 |
java_ 3_조건문(if문, switch문) (0) | 2021.10.22 |