예외(Exception) 처리하기
Exception handling
- 프로그램 실행 시 발생할 수있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이다.
- 예외의 발생으로 인한 실행중인 프로그램의 갑작스런 비정상적인 동작을 막고, 에러를 잡아 복구를 시도하거나 아니면 회피 하는식으로 처리를해서, 프로그램이 정상적인 실행상태를 유지할수있도록 하는것이다.
try - catch 문
try 블록에는 예외발생 가능 코드가 위치하고 만일 코드에 오류가 발생되면, 오류 종류(예외클래스)에 맞는 catch문으로 가서 catch 블록 안에 있는 코드를 실행 시킨다.
만일 오류가 발생하지 않으면 catch문은 실행하지 않는다.
catch 문은 예외클래스 타입과 변수 e 가 선언되어 있는데, 만일 try 문에서 예외가 발생하면 그 예외에 맞는 예외클래스가 catch문에 아규먼트로 선언되어 있으면 실행되어 옳지 못한 동작에 대해서 대비를 할수있다.
public class Exception {
public static void main(String[] args) {
int a, b, c;
try {
// ... 길다란 코드
// ... 길다란 코드
// ... 길다란 코드
} catch (NumberFormatException e) {
System.out.println("숫자로 변환할 수 없습니다.");
} catch (ClassNotFoundException e) {
System.out.println("클래스가 존재하지 않습니다.");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족합니다.");
} catch (IOException e) {
System.out.println("입력값이 잘못 되었습니다.");
} catch (NullPointException e) {
System.out.println("NULL을 참조하고 있습니다.");
} ...
}
}
클래스의 상속 관계(다형성)을 이용하여 예외클래스의 상위 클래스인 Exception 클래스 타입을 catch문 아규먼트에 선언하면, 코드 몇줄만으로 자바의 나머지 모든 예외 클래스를 catch문으로 받아 들일수 있게 된다.
try - catch - finally 문
- 어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야한다면 finally 문으로 처리가 가능하다.
Sample sample = new Sample();
try {
sample.addSample(100);
sample.printSample(); // 만일 이 메서드를 실행하는데 에러가 나버리면 !
} catch (Exception e) {
// ... catch 문의 코드가 실행되고
} finally {
sample.shouldBeRun(); // 에러가 나든 안나든 무조건 finally 문은 실행된다.
}
메소드의 return 문이 있어도 일단 finally의 코드를 실행하고 리턴한다.
예외가 발생한 경우에는 try → catch → finally 의 순으로 실행되고, 예외가 발생하지 않는 경우에는 try → finally 의 순으로 실행된다.
multi catch 문
try {
// ...
} catch (NullPointException | ArrayIndexOutOfBoundsExcetion e) {
if(e instanceOf NullPointException) {
// ...
} else if(e instanceOf ArrayIndexOutOfBoundsExcetion) {
// ...
}
}
멀티 캐치문은 위의 부모 예외 클래스 Exception과 같이 여러 개의 예외를 전부 처리하는 것이기 때문에 각 예외마다 세세하게 제어하고 싶다면 if 문과 instanceOf 연산자로 분기하며 처리해야 한다.
예외 메세지 출력
- catch 문의 Eecption e 에서 Exception → 변수의 클래스 타입, e → 변수 이다.
오류와 예외 모두 자바의 최상위 클래스인 Object를 상속받는다.
그리고 그 사이에는 Throwable 클래스와 상속관계가 있는데, Throwable 클래스의 역할은 오류나 예외에 대한 메시지를 담는 것이다. 대표적으로 getMessage() 와 printStackTrace() 메서드가 바로 이 클래스에 속해 있다. 당연히 Throwable을 상속받은 Error와 Exception 클래스에서도 위 두 메서드를 사용할수 있게 된다.
printStackTrace()
예외 발생 당시의 호출스택 (Call Stack) 에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage()
발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을수있다.
'JAVA' 카테고리의 다른 글
[JAVA] input, output Stream and file input, output (0) | 2023.07.19 |
---|---|
[JAVA] Beep (0) | 2023.07.19 |
[JAVA] Thread (0) | 2023.07.19 |
[JAVA] Collection(Map) (0) | 2023.07.19 |
[JAVA] Collection(Stack) (0) | 2023.07.18 |