예외처리(try-catch-finally) 제대로 이해하기 — 실전 에러 대응법
자바를 배우다 보면 “try-catch-finally” 구문을 수없이 보게 됩니다.
하지만 막상 실무에서 예외가 터지면 “이걸 왜 쓰는지” “finally는 언제 실행되는지” 헷갈리곤 하죠.
이번 글에서는 초보자도 한 번에 이해할 수 있도록 예외처리의 구조, 흐름, 그리고 실무 활용법을 예제 중심으로 정리했습니다.

1. 예외(Exception)란 무엇인가?
프로그램이 실행 중 예상치 못한 상황에 부딪히면 “예외(Exception)”가 발생합니다.
예를 들어 파일이 없거나, 0으로 나누거나, null 객체를 호출할 때 생기는 오류죠.
int result = 10 / 0; // ArithmeticException 발생
예외처리의 목적은 프로그램이 멈추지 않고, 문제를 ‘우아하게’ 처리하게 만드는 데 있습니다.
즉, 사용자는 오류를 보지 않고 개발자는 원인을 알 수 있게 하는 장치인 셈이에요.
2. try-catch 기본 구조
예외가 발생할 수 있는 코드를 try 블록에 넣고, 문제가 생겼을 때 실행할 코드를 catch 블록에서 처리합니다.
형식은 아래와 같습니다.
try {
// 예외가 발생할 가능성이 있는 코드
} catch (Exception e) {
// 예외가 발생했을 때 실행되는 코드
}
💡 예시:
try {
int result = 10 / 0;
System.out.println("결과: " + result);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다!");
}
결과는 콘솔에 0으로 나눌 수 없습니다! 라고 출력됩니다.
프로그램은 멈추지 않고 정상적으로 종료됩니다.
3. finally — 무조건 실행되는 블록
finally 블록은 예외 발생 여부와 관계없이 반드시 실행되는 코드입니다.
주로 파일 닫기, DB 연결 종료, 리소스 정리 등에 사용됩니다.
try {
FileReader fr = new FileReader("data.txt");
// 파일 읽기 작업
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다.");
} finally {
System.out.println("리소스 정리 완료!");
}
💡 실행 순서:
1) try 실행 → 2) 예외 발생 → 3) catch 실행 → 4) finally 실행
finally는 return 문이 있어도 무조건 수행됩니다. (단, System.exit() 호출 시는 예외)
4. 여러 예외 처리하기
하나의 try 블록 안에서 여러 종류의 예외가 발생할 수 있다면, catch 블록을 여러 개 작성할 수 있습니다.
가장 구체적인 예외부터 순서대로 배치해야 합니다.
try {
String s = null;
System.out.println(s.length());
} catch (NullPointerException e) {
System.out.println("Null 객체 접근 불가");
} catch (Exception e) {
System.out.println("기타 예외 발생");
}
✅ 주의:
상위 클래스인 Exception을 먼저 작성하면 아래의 구체적인 예외가 도달하지 못합니다.
5. 예외 던지기(throw / throws)
때로는 메서드 내부에서 예외를 직접 처리하지 않고, 호출한 쪽으로 “던지는(throw)” 방식도 사용합니다.
이때는 메서드 선언부에 throws를 명시합니다.
public void readFile(String path) throws IOException {
FileReader fr = new FileReader(path);
}
💡 활용 예시:
main 메서드에서 try-catch로 처리하면 코드가 깔끔해집니다.
try {
readFile("data.txt");
} catch (IOException e) {
System.out.println("파일 읽기 중 오류 발생");
}
6. 실무에서 자주 쓰는 패턴
실무에서는 모든 예외를 콘솔에 출력하기보다는, 로그로 남기고 사용자에게는 친절한 메시지만 보여주는 방식을 선호합니다.
예를 들어 Spring Boot에서는 @ExceptionHandler나 전역 예외 처리용 ControllerAdvice를 사용합니다.
try {
service.saveUser(user);
} catch (Exception e) {
log.error("회원 저장 중 오류", e);
throw new CustomException("서버 내부 오류가 발생했습니다.");
}
이렇게 하면 콘솔에는 구체적인 로그가 남고,
사용자 화면에는 “잠시 후 다시 시도해주세요”라는 메시지만 표시됩니다.
마무리
예외처리는 단순히 오류를 잡는 기술이 아니라, 프로그램의 안정성을 높이는 전략입니다.
try-catch-finally의 실행 순서와 의미를 명확히 이해하면, 에러를 ‘두려운 존재’가 아닌 ‘예상 가능한 상황’으로 다룰 수 있습니다.
다음 글에서는 “화면에서 백단 쿼리로 파라미터 넘기기 — JSP & Servlet 실습”을 다뤄보겠습니다.
실제 웹 요청이 백엔드로 어떻게 전달되는지 알고 싶다면 꼭 이어서 읽어보세요!
'개발자 기초 & 실무' 카테고리의 다른 글
| 콘솔 로그로 디버깅하기 — println에서 logback까지 실무 가이드 (0) | 2025.11.13 |
|---|---|
| 화면에서 백단 쿼리로 파라미터 넘기기 — JSP & Servlet 실습 (0) | 2025.11.12 |
| Git 시작하기 — Push, Pull, Merge 충돌 해결까지 초보자를 위한 3단계 (0) | 2025.11.09 |
| 가장 흔한 자바 에러 10가지, 초보자도 쉽게 해결하는 디버깅 가이드 (0) | 2025.11.08 |
| JSP 코드 자동 정렬 단축키와 포맷 설정으로 가독성 높이기 (0) | 2025.11.06 |