본 내용은 <자바의 정석> 내용을 복습, 정리하였습니다.
StackOverflowError
, OutOfMemoryError
try {
// 예외가 발생할 가능성이 있는 문장
// try 블럭 내에서 예외 발생 시 발생한 예외와 일치하는 catch 블럭이 있는지 확인
// 일치하는 catch 블럭이 없다면 예외는 처리되지 못함
} catch (발생할 예외 e) {
// 예외 발생 시 처리할 문장
}
// try 블럭 내에서 예외가 발생하지 않는다면 try-catch문을 빠져나가서 수행을 계속
printStackTrace()
: 예외 발생 당시의 호출 스택(call stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력getMessage()
: 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻음try {
} catch (ExceptionA | ExceptionB | ExceptionC e) {
}
public void example() throws IOException, DataAccessException {
}
try {
} catch (Exception e) {
} finally {
// 예외 발생 여부와 관계 없이 항상 수행되어야 하는 문장들
// try-catch문의 마지막에 위치
}
// 기존
try {
fis = new FileInputStream("score.dat");
dis = new DataInputStream(fis);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(dis!=null) dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// try-with-resource
try (fis = new FileInputStream("score.dat");
dis = new DataInputStream(fis);){
...
} catch (IOException e) {
e.printStackTrace();
}
void addSuppressed(Throwable exception) // 억제된 예외를 추가
Throwable[] getSuppressed() // 억제된 예외(배열)을 반환
public class MyException extends RuntimeException {
public MyException() {
super();
}
}
try {
} catch (Exception e) {
throw new NewException();
}
Throwable initCause (Throwable cause) // 지정한 예외를 원인 예외로 등록
Throwable getCause() // 원인 예외를 반환
// 감싸기 전
public void test throws SpaceException, MemoryException {
if (!enoughSpace()) throw new SpaceException();
// Exception의 자손이므로 checked 예외라 반드시 예외 처리를 해야 함
if (!enoughMemory()) throw new MemoryException();
}
// 감싼 후
public void test throws SpaceException {
if (!enoughSpace()) throw new SpaceException();
// RuntimeException으로 감싸 unchecked 예외가 됨
if (!enoughMemory()) throw new RuntimeException(new MemoryException);
}