자바에서는 실행할 수 있는 오류를 각각 Exception
, Error
클래스로 정의하였고 Object 클래스의 자손들(children)임
모든 예외의 최고 조상은 Exception class이고 다음과 같이 표현할 수 있음
여기서 RuntimeException과 그 자손클래스들은 RuntimeException 클래스들이라 하고 나머지들은 Exception 클래스라고 함
RuntimeException classes
: 프로그래밍 요소들과 관계가 깊음. 0으로 나누려고 하는 경우에 발생하는 ArithmeticException, 값이 null인 참조변수의 멤버를 호출하려다가 생기는 NullPointerException 등등..Exception classes
: 외부적인 영향으로 발생할 수 있는 예외. 존재하지 않는 파일이름을 입력했거나(FileNotFoundException), 클래스의 이름을 잘못 적었거나 (ClassNotFoundException), 데이터 형식이 잘못된 경우(DataFormatException)class ExceptionEx1{
public static void main(String args[]) {
try {
try{ } catch(Exception e){ }
}catch (Exception e){
try{ } catch(Exception e){ } // --> error 'e' 가 중복 선언
}
}
}
💡 예외가 발생했을 때 생성되는 예외클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨져 있으며 다음 method들을 통해 정보를 얻을 수 있음
printStackTrace()
: 예외 발생 당시의 호출 스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력getMessage()
: 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있음키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있으며, 방법은 아래와 같음
Exception e = new Exception("고의로 발생시킴");
throw e;
지금까지는 예외를 try-catch문을 사용해서 처리했었는데 예외를 method에 선언하는 방법도 있다.
void method() throws Exception1, Exception2, ...ExceptionN {
...
}
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("OutFile.txt");
...
} catch (IOException e) {
...
} finally {
if (out != null)
out.close();
}
try (FileWriter f = new FileWriter("OutFile.txt");
PrintWriter out = new PrintWriter(f)) {
...
} catch (IOException e) {
...
}
class MyException extends Exception {
private final int ERR_CODE;
MyException(String msg, int errCode) {
super(msg);
ERR_CODE = errCode;
}
MyException(String msg) {
this(msg, 100);
}
public int getErrCode() {
return ERR_CODE;
}
}
void method1() throws Exception {
try {
throw new Exception();
catch (Exception e) {
...
throw e;
}
}
try {
...
} catch (SpaceException e) {
InstallException ie = new InstallException();
ie.initCause(e);
throw ie;
}