1. try-catch-finally 기본 구조
- try 블록: 예외가 발생할 수 있는 코드 작성
- catch 블록: 예외 발생 시 실행될 코드
- finally 블록: 예외 여부와 상관없이 항상 실행되는 코드
예시 코드
try {
int result = 10 / 0; // 예외 발생
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
} finally {
System.out.println("무조건 실행됩니다.");
}
finally는 return 보다 항상 늦게 실행 됩니다.
System.exit(0) 호출 시 finally는 실행되지 않습니다.
2. try-with-resources
Java 7 이상부터 사용 가능한 기능입니다.
AutoCloseable 인터페이스로, try에 ()를 넣어 작성합니다.
try 블럭 밖으로 나가면 자동으로 close()
예시 코드
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
try() 괄호 안에서 BufferedReader를 선언합니다.
만약 try - with - resources 구조로 생성하지 않았다면, br.close()가 반드시 호출되어야 합니다.
하나의 괄호 안에 여러가지를 선언하고자 한다면 ; 으로 구분할 수 있습니다.
예시
try (PreparedStatement insertPstmt = conn.prepareStatement(insertSQL.toString());
PreparedStatement updatePstmt = conn.prepareStatement(updateSQL.toString());) {
} catch (Exception e) {
...
}
위의 코드는 PreparedStatement를 선언한 insertPstmt와 updatePstmt를 동시에 선언하였다.
해당 try 블럭을 벗어나면 두 값은 자동으로 close 처리 된다.
3. 다양한 catch 예외 처리
대표적인 예외 클래스
예외 클래스 설명
예외 클래스 | 설명 |
IOException | 입출력 오류 |
FileNotFoundException | 파일이 존재하지 않음 |
SQLException | DB 접근 시 오류 |
NullPointerException | 객체가 null일 때 접근 시도 |
ArithmeticException | 0으로 나누기 등 수학 오류 |
IllegalArgumentException | 잘못된 매개변수 전달 시 |
다중 catch 처리
try {
// 예외 발생 가능성 있는 코드
} catch (IOException | SQLException e) {
e.printStackTrace();
}
| 를 사용하여 구분
Q. Exception 만 써도 되는것 아닌가? 왜 여러가지 예외 처리를 구분하는 가?
catch (Exception e) 만 사용해도 프로그램이 수행하는데 문제 없음.
다만, 문제의 원인을 정확히 파악하기 위해 catch 예외처리를 다양화 하는게 좋음.
catch (Exception e) {
// 뭔가 잘못됐지만, IO 문제인지 DB 문제인지 모름.
}
또한, 각 예외마다 다른 처리 방식을 지정해줄 수 있는 유연성이 확보됨.
try {
readFile();
connectDatabase();
} catch (FileNotFoundException e) {
// 파일 생성 제안
} catch (SQLException e) {
// DB 재연결 로직
} catch (Exception e) {
// 기타 예외 로깅
}
4. 예외 출력 방법
이제 catch 에 Exception 까지 추가했다. 하지만 예외를 출력하는 방법 또한 다양하다.
방법 | 설명 |
e.printStackTrace() | 예외 발생 위치 포함 전체 스택 트레이스 출력 (가장 디버깅에 유용) |
e.getMessage() | 예외에 대한 간단한 메시지만 출력 |
e.getLocalizedMessage() | 로케일에 맞춘 메시지 (거의 동일하지만 메시지를 다국어로 구성할 때 유용) |
System.out.println(e) | toString() 결과 출력 (클래스: 메시지) |
예시 코드
try {
int a = 5 / 0;
} catch (Exception e) {
e.printStackTrace(); // 전체 예외 정보
System.out.println(e.getMessage()); // "/ by zero"
System.out.println(e); // "java.lang.ArithmeticException: / by zero"
}
e.printStackTrace() 는 개발 과정에서 주로 사용하면 좋다.
하지만 실무 단계에서는 개발이 아닌 서비스의 단계이므로 로그파일에 남겨둬야만 한다.
로그파일에 e 혹은 e.getMessage()를 남겨두면 예외가 발생한 지점에서 로그파일에 남겨지니 추후 관리가 용이하다.
'Language > Java' 카테고리의 다른 글
[Java] 네이버웍스 서비스 계정(JWT) 인증 방법 (1) | 2025.04.28 |
---|---|
[Java] AES-256 암호화/복호화 하기 (0) | 2023.06.15 |
[Java] BigInteger 다루기 (백준 1247번 - 부호) (0) | 2023.04.12 |
[Java] 트리 구현하기 (이진트리, 전위순회, 중위순회, 후위순회) (0) | 2023.04.08 |
[Base64][암호화] + 기호가 " "(공백) 으로 바뀌는 현상 (0) | 2023.03.13 |
댓글