- 컴파일 에러 : 컴파일 시에 발생하는 에러
- 런타임 에러 : 실행 시에 발생하는 에러
- 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
- 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
- 논리적 에러 : 실행은 되지만, 의도와 다르게 동작
try {
//예외 발생 가능성이 있는 문장
} catch (Exception1 e1){
// 예외 발생시 처리할 문장
} catch (Exception2 e2){
// 예외 발생시 처리할 문장
}finally {
//예외의 발생 여부에 관계없이 항상 수행되어야하는 문장
// try 구문에 return이 수행되어도 finally 블럭은 수행됨
}
동작 순서
1. 발생한 예외와 일치하는 catch 블럭을 찾는다.
2. 일치하는 catch 블럭을 찾으면, 그 블럭 내의 문장을 수행한 후 try-catch 문을 빠져나가 다음 문장을 계속 수행한다.
예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어 진다.
catch블럭에서 (괄호) 안에는 처리하고자 하는 예외와 같은 타입의 참조 변수를 선언한다.
그러면 instanceof 연산자를 사용하여 발생한 예외와 일치하는 catch 블럭을 찾아낸다.
마지막 catch블럭에는 Exception타입의 참조변수를 선언하면 어떤 종류의 예외가 발생하더라도 처리할 수 있다.
예외발생 당시의 call stack에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
try {
//예외 발생 가능성이 있는 문장
} catch (Exception1 e1){
e1.printStackTrace();
System.out.println(e1.getMessage());
}
try {
//예외 발생 가능성이 있는 문장
} catch (Exception1 | Exception2 e{
// 예외 발생시 처리할 문장
}
- 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다
Exception e = new Exception("테스트 에러");
- 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
void method() throws Exception1, Exception2...{
// method 내용
}
메서드를 작성할 때 메서드 내에서 발생할 가능성이 있는 예외를 메서드의 선언부에 명시하여 이 메서드를 사용하는 쪽에서는 이에 대한 처리를 하도록 강요하기 때문에 보다 견고한 프로그램을 작성할 수 있다.
class MyException extends Exception {
MyException (String msg) {
super(msg);
}
}