이 노트는 "윤성우의 열혈 java 프로그래밍" 책을 공부하면서
내가 이해한대로 다시 정리하면서 작성되었다.
try{
// 관찰 영역
} catch (Exception name) {
// 처리 영역
}
try
영역에서 발생한 예외 상황을 catch
영역에서 처리한다.catch
는 메소드처럼 동작한다.자바는 예외 상황별로 그 상황을 알리기 위한 클래스를 정의하고 있다.
이러한 클래스를 가리켜 '예외 클래스'라고 한다.
만약 수학 연산 관련 오류가 발생하면 가상머신은 예외 클래스 AriyhmrticException
의 인스턴스를 생성하고,
이 인스턴스를 프로그래머가 처리하면 예외는 처리된 것으로 간주하여 프로그램을 종료하지 않는다.
두 가지 예외 상황에 대한 처리를 하고 싶다면 catch
구문들을 이어서 구성하면 된다.
...
try {
System.out.print("a/b...a?");
int n1 = kb.nextInt();
System.out.print("a/b...b?");
int n2 = kb.nextInt();
System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
} catch (ArithmeticRxception | InputMismatchException e) {
e.getMessage();
}
상황별 예외의 처리 방식이 다르지 않을 경우, 위와 같이 하나의 catch
구문 안에서 모든 예외가 처리될 수 있도록 묶어주는 것도 방법이다.
자바의 최상위 클래스인 java.lang.Object
를 제외하고 예외 클래스의 최상위 클래스는 java.lang.Throwable
이다.
이 클래스의 getMessage()
메소드는 예외의 원인을 담고 있는 문자열을 반환하며, printStackTrace()
는 예외가 발생한 위치와 호출된 메소드의 정보를 출력한다.
프로그래머는 Exception
클래스를 상속하여 예외 클래스를 정의할 수 있다.
import java.util.Scanner;
class ReadAgeException extends Exception {
public ReadAgeException() {
super("유효하지 않은 나이가 입력되었습니다.");
}
}
class MyExceptionCalss {
public static void main(String[] args) {
System.out.print("나이 입력 : ");
try {
int age = readAge();
System.out.printf("입력된 아니 : %d \n", age);
} catch (ReadAgeException e) {
System.out.println(e.getMessage());
}
public static int readAge() throw ReadAgeException {
Scanner kb = new Scanner(System.in);
if (age < 0) {
throw new ReadAgeException();
}
return age;
}
}
}
음수를 입력받았을 때 예외로 처리하기 위해 예외 클래스를 직접 정의하였다.
예외 클래스의 인스턴스를 생성하고 이를 대상으로 throw 선언을 하면 예외가 발생이 된다.
이 과정을 인스턴스 생성과 예외의 발생을 구분한다면 다음과 같다.
throw (new ReadAgeException());
finally
구문을 두면 코드의 실행이 try
안으로 진입할 때 무조건 실행이 된다.
try {
...
} catch(Exception name) {
...
} finally {
... // try 안으로 진입하면 무조건 실행
}
try
에서 예외가 발생하건 안하건, catch
강 실행되건 안되건 무조건 실행된다.
finally
구문 안에서 try-catch를 처리하는 문제를 해결하기 위해 나온 방안이다.
try(resource) { // 종료 과정을 필요로 하는 리소스 생성 가능
} catch(Exception name) {
}