만약 Exception
이 발생할 수도 있는 메소드 problemMethod()
가 있다고 해보자
try-catch
try 블록 안에서 문제의 메소드를 호출하고 catch블록에서 에러를 처리한다.
catch 블록에는 빈 블록으로 두지 않고 예외처리 구문을 작성하는 것이 좋다.
public void runMethod(){
try{
problemMethod();
}
catch(Exception e){
//예외 처리!
}
}
try-catch-finally
예외처리 구문이 끝나면 finally 블록이 실행된다.
try 블록 안에 return이 있어도 실행된다.
public void runMethod(){
try{
problemMethod();
return;
}
catch(Exception e){
//예외 처리!
}
finally{
System.out.println("finally");
}
}
//finally가 출력된다.
try - with - resources
try 블록에서 사용될 리소스를 받을 때 사용한다.
리소스가 close가 필요한 객체인 경우 예외가 발생할때 자동으로 반환된다.
public void runMethod(){
try (BufferedReader br =
new BufferedReader(new FileReader(path))) {
return br.readLine();
}catch{
//예외 처리!
}
}
throw
예외를 의도적으로 발생시킬때 사용한다.
public void runMethod(){
throw new RuntimeException("Runtime Exception!");
}
throws
메소드에서 발생한 예외에 대한 처리를 호출하는 곳으로 전가한다.
public void runMethod() throws Exception{
problemMethod();
}
Throwable
클래스에 Error
와 Exception
클래스가 있다.
Error
는 시스템에서 발생하는 문제이고 Exception
은 구현한 로직에서 발생하는 문제이다.
컴파일 시점에 발생하는 에러를 컴파일 에러라고하고 런타임 시점에 발생하는 에러를 런타임 에러라고 한다.
런타임 시점에서 발생하는 에러 중 시스템 레벨에서 발생한 에러가 아닌 로직 내에서 발생한 에러, 즉 처리 가능한 에러를 예외라고 한다.
RuntimeException은 Unchecked Exception이다. RuntimeException을 제외한 Exception은 Checked Exception이다.
Checked Exception은 명시적으로 예외처리를 해야한다.
Exception 클래스를 상속받아 커스텀한 예외를 만들 수 있다.
class MyException extends RuntimeException{
...
}