
기본 구조: try-catch-finally
예외 발생 여부와 상관없이 finally 블록은 항상 실행됨
예외 확인 방법
try {
int result = 10 / 0;
} catch (Exception e) {
System.out.println(e.getMessage()); // 예외 원인
System.out.println(e.toString()); // 예외 종류 + 원인
e.printStackTrace(); // 예외 발생 위치까지 출력
} finally {
System.out.println("finally 블록 실행");
}
다중 catch 가능. 단, 하위 예외 → 상위 예외 순서로 작성
여러 예외를 한 번에 처리: catch(A | B e)
try {
String data = null;
System.out.println(data.length());
} catch (NullPointerException | NumberFormatException e) {
System.out.println("예외 발생: " + e.getMessage());
}
리소스(파일, DB 연결 등)는 사용 후 반드시 닫아야 함
기존 방식 (finally 사용)
FileInputStream fis = null;
try {
fis = new FileInputStream("file.txt");
// 파일 읽기
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) try { fis.close(); } catch (IOException e) {}
}
try-with-resources (Java 7~)
try (FileInputStream fis = new FileInputStream("file.txt")) {
// 파일 읽기
} catch (IOException e) {
e.printStackTrace();
}
Java 9 이후 : 외부에서 선언한 리소스도 사용 가능
FileInputStream fis1 = new FileInputStream("file1.txt");
FileInputStream fis2 = new FileInputStream("file2.txt");
try (fis1; fis2) {
// 두 파일 처리
}
메소드에서 예외를 직접 처리하지 않고 호출한 쪽으로 전달
public void readFile(String path) throws IOException {
FileInputStream fis = new FileInputStream(path);
fis.close();
}
main()에서도 throws 가능 → JVM이 최종 처리
Exception 상속RuntimeException 상속public class MyException extends Exception {
public MyException() {}
public MyException(String message) {
super(message);
}
}
public void process(int value) throws MyException {
if (value < 0) {
throw new MyException("음수 값은 허용되지 않습니다.");
}
System.out.println("처리 완료: " + value);
}
public static void main(String[] args) {
try {
new Test().process(-5);
} catch (MyException e) {
System.out.println("예외 처리: " + e.getMessage());
}
}