예외란? Abbreviation for Exceptional Event(which occurs during the execution of a program, that disrupts the normal flow of the program)
메서드에서 에러가 발생할 경우 어떤 객체를 만들어 런타임 시스템에 전달하는데 여기서 '어떤 객체'가 바로 예외. It carries info about the error, such as its type and the state of the program when the error occured. 이렇게 예외를 만들어 전달하는 과정을 예외를 throw
한다고 말한다.
예외가 발생한 상황에서 런타임 시스템은 예외를 받아 처리해줄 것을 찾는다. 에러가 발생한 메서드를 사용하기위해 호출된 메서드의 집합을 call stack이라고 하고 런타임 시스템은 exception을 처리해주는 코드블럭 (aka exception handler)를 찾을때까지 콜스택을 거슬러 올라간다. 핸들러를 찾으면 예외를 전달해주고 핸들러는 예외를 받아(catch) 처리한다.
예외가 발생할 수 있는 부분을 try로 감싸고, try에서 예외가 발생하면 해당하는 예외를 잡아주는 catch부분이 실행된다.
try {
// 예외가 발생할 가능성이 있는 코드
} catch (PossibleException1 e) {
// try에서 발생한 예외가 PossibleException1에 해당한다면 여기서 처리
} catch (PossibleException2 e) {
// try에서 발생한 예외가 PossibleException2에 해당한다면 여기서 처리
}
catch
는 여러 블럭이 붙을 수 있지만 try
에서 발생한 예외 타입에 따라 catch
는 한번만 실행된다.
finally
는 try
와 catch
이후에 붙을 수 있는 코드블럭으로 예외발생 여부에 상관없이 무조건 실행된다. try
에서 예외가 발생하지 않는 경우 try
-finally
, 예외가 발생해서 캐치부분이 실행될 경우 try
-catch
-fianlly
순으로 실행된다. finally
블럭은 필수가 아니라 얼마든지 생략해도 좋다.
throw
는 강제적으로 예외를 발생시키는 방법. 원하는 부분에 원하는 예외를 발생시켜주면 된다.
throws
키워드가 붙은 메서드는 예외를 던질 수 있다 라는 것을 명시해주고 예외가 발생할 시 해당 메서드를 호출한 메서드에게 예외를 전달해준다. 예외 처리와는 관련이 없고 전달만 해주기때문에 어디서든 반드시 예외처리부분이 필요하다.
public void iThrowException(String str) throws Exception1 {
if (str.length() > 5) {
throw new Exception1("example exception");
}
}
public static void main(String[] args) {
iThrowException("Hello World"); // 예외발생
}