unusual한 무언가가 일어났을 때 신호를 보내는 기작
exceptional case를 다루는 코드
pass the buck
예외만 던지는 메서드
중간에 throw 예외 객체
* 메서드 정의는 아님
i) ㄱ. 정상 흐름 ㄴ. finally
ii) ㄱ. 예외 catch ㄴ. finally
iii) ㄱ. 예외 catch 실패 ㄴ. finally ㄷ. method 종료, 밖으로 exception object 던져짐

1) catch 블록에서 포착하거나 2) throws 키워드로 예외 선언을 해야 함
예외를 잡아서 처리하지 않아도 throws키워드를 생략할 수 있다
package exception.basic.unchecked;
/**
* RuntimeException을 상속받은 예외는 언체크 예외가 된다. */
public class MyUncheckedException extends RuntimeException {
public MyUncheckedException(String message) {
super(message);
}
}
package exception.basic.unchecked;
public class Client {
public void call() {
throw new MyUncheckedException("ex");
}
}
package exception.basic.unchecked;
/**
* UnChecked 예외는
* 예외를 잡거나, 던지지 않아도 된다.
* 예외를 잡지 않으면 자동으로 밖으로 던진다. */
public class Service {
Client client = new Client();
/**
* 필요한 경우 예외를 잡아서 처리하면 된다. */
public void callCatch() {
try {
client.call();
} catch (MyUncheckedException e) {
//예외 처리 로직
System.out.println("예외 처리, message=" + e.getMessage()); }
System.out.println("정상 로직"); }
/**
* 예외를 잡지 않아도 된다. 자연스럽게 상위로 넘어간다.
* 체크 예외와 다르게 throws 예외 선언을 하지 않아도 된다. */
public void callThrow() {
client.call();
} }
check exception과 다르게 (예외를 처리할 수 없을 때 밖으로 던지는) throws예외 선언을 컴파일러가 체크하지 않기 때문에 '언체크' 예외이다.
모든 predefined exception class는
getMessage accessor가 있음동일한 예외에 대해서는 일관된 방식으로 처리 즉, 특정 예외를 catch 블록에서 처리하지 않으면 throws 키워드로 선언해야 하고, 반대로 catch 블록에서 처리하면 throws 키워드로 선언할 필요가 없어
Public class MyException extends Exception{
// variables
public MyException() {
super("default message");
//perform other tasks
}
public MyException(VariableType var){
super(var+ "rest of message");
//perform other tasks
}
//other methods if needed
}
import java.util.Scanner;
import java.util.InputMismatchException; //unchecked
public class InputMismatchExceptionDemo {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int number = 0;
boolean done = false;
while (!done) {
try {
System.out.println("Enter a whole num");
number = keyboard.nextInt();
done = true;
}
catch (InputMismatchException e) {
keyboard.nextline(); //예외가 발생한 후에는 여전히 잘못된 입력이 남아있으므로 이를 소비.
System.out.println("Not a correclty written whole number");
}
}
System.out.println("You entered " + number);
}
}