자바에서 예외는 두가지로 분류된다
: try-catch문을 활용하여 에러를 핸들링한다.
try블록에서 예외가 발생하면 JVM이 해당 Exception 클래스의 객체를 생성한 후 던진다.(throw) 그리고 던져진 예외를 처리할 수 있는 catch블록에서 이를 받아 처리한다. 만약 없다면 예외처리에 실패한다. 정상적으로 처리되면 try-catch블록을 벗어나고 다음문장을 실행하게 된다.
메소드에서 처리해야할 하나 이상의 예외를 호출한 곳으로 전달한다.
예외가 없어지는것이 아닌 단순 전달이다. 따라서 전달받은 메소드는 예외처리 책임이 발생한다.
(CF) 메소드를 재정의할때, 즉 ClassNotFoundException을 thorws하는 메소드를 가지는 Parent를 상속받아 재정의하는 메소드는 ClassNotFound보다 큰 메소드로 해당 메소드를 재정의 할 수 없다.
에러핸들링 방법은 예제로 이해하는게 편하다!
checkedException의 경우엔 Exception을, uncheckedException의 경우엔 RuntimeException 클래스를 상속받는것에 유의한다.
// 잘못된 동물이름 입력이 들어올경우 처리해주는 핸들러
public class AnimalNotFoundException extends Exception {
public AnimalNotFoundException(String name){
//예외메세지
super(name+"에 해당하는 동물은 존재하지 않습니다.");
}
}
public class Test{
private static String[] Animals = {"고양이","강아지","판다"};
public static void main(String[] args){
try{
getAnimal("강아지");
getAnimal("푸바오");
} catch(AnimalNotFoundException e){
e.printStackTrace(); //AnimalNotFoundException
}
}
private static void getAnimal(String name) throws AnimalNotFoundException {
for(int i=0; i<animals.length; i++){
if(animals[i]!=null && animals[i].equals(name)){
//..
return;
}
}
throw new AnimalNotFoundException(name); //만약 uncheckedExcpetion이었다면 throws엔 아무것도 작성하지 않아도됨
}
}