자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
try-catch-finally
try {
// 예외가 발생할 수 있는 코드
} catch (예외클래스1 변수명) {
// 예가 발생했을 때 해당 예외를 처리할 수 있는 코드
} catch (예외클래스2 변수명) {
// 예가 발생했을 때 해당 예외를 처리할 수 있는 코드
} finally {
// 예외 발생 여부 상관 없이 항상 실행되는 코드
}
catch
catch는 하나 이상 있을 수 있음
finally
생략가능
Throws
메서드 throws 예외 클래스 이름
public static void main(String[] args) throws IOException {
byte[] receive = new byte[64];
Read(receive);
}
private static void Read(byte[] buffer) throws IOException {
System.in.read(buffer);
}
- 반드시 시그니쳐 옆에 추가해야함
- checked 예외를 던지는 메서드
- 다른 메서드에서 발생한 checked 예외를 처리하지 않는 메서드
- 추가 안하면 컴파일 오류
예외 처리시 주의 사항
부모 예외 클래스가 자식보다 먼저 나오면 안된다.
try {
} catch (Exception e) {
} catch (ArithmeticException e) {
// 자식 예외 클래스가 실행되지 못한다
}
printStackTrace()
현재 발생한 예외의 호출 스택을 보여줌
예외 발생시 진행 순서
1. try 블록 실행이 중단
2. catch 블록 중에 예외를 처리할 수 있는지 찾음
3. 예외를 처리할 수 있는 catch 블록이 없으면 finally 블록을 실행 후, 한 단계 높은 try 블록으로 전달
4. 예외를 처리할 수 있는 catch 블록이 있으면 catch 안의 코드 실행 fianlly 블록 실행
RuntimeException의 생성자
public RuntimeException() {
super();
}
public RuntimeException(String message) {
super(message);
}
public RuntimeException(String message, Throwable cause) {
super(message, cause);
}
public RuntimeException(Throwable cause) {
super(cause);
}
protected RuntimeException(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
자식 클래스 생성자에서 반드시 super() 호출해야함
호출을 안하면 message, cause가 저장되지 않음
try-with-resource
try (InputStream is = new FileInputStream(file)) {
// 필요한 코드 실행
} catch (Exception e) {
//예외 발생 시, 예외에 대한 처리
}
java 1.7 에서 도입
try에 자원 객체를 전달하고, try 코드 블록이 끝나면 자동으로 자원 종료
자바가 제공하는 예외 계층 구조
Checked Exception
- 컴파일러가 예외 처리를 하는지 확인(Check) 해줌
- 어느 메서드가 어떤 예외를 던지는지 명확히 알 수 있음
- 예외가 발생하는 코드에서 catch 블록에서 예외를 처리, catch 처리를 안하면 시그니처 옆에 표기
ex) IOException, SQLException
UnChecked Exception
- RuntimeException을 상속
- 컴파일러가 따로 검사를 안해줘서 unchecked 예외
Exception 클래스를 상속하면 checked exception
RuntimeException을 상속하면 unchecked exception
Exception과 Error의 차이는?
Exception
프로그램이 핸들링 할 수 있음
Error
시스템에 비정상적인 상황. 시스템 레벨의 심각한 오류. 개발자가 핸들링이 불가능하다.
RuntimeException과 RE가 아닌 것의 차이는?
RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준.
Exception 자식 클래스 중 RuntimeException을 제외한 클래스는 CheckedException이다.
커스텀한 예외 만드는 방법
Exception을 상속 받아 예외를 만들거나, RuntimeException을 상속받아 실행 예외를 만들 수 있다.
public class CustomException extends RuntimeException{
public CustomException() {
super();
}
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable cause) {
super(message, cause);
}
public CustomException(Throwable cause) {
super(cause);
}
protected CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}