✅ 기본 문법 구조
try {
// 예외 발생 가능성 있는 코드
} catch (Exception e) {
// 예외 처리
} finally {
// 예외와 관계없이 항상 실행되는 코드 (자원 정리 등)
}
🧩 각 부분 설명
📍 예외클래스타입 (catch 괄호 안의 첫 번째)
- 어떤 종류의 예외를 잡을 것인지 지정하는 부분
- 자바에는 Exception을 상속받은 다양한 예외 클래스들이 있음
- 예시:
- ArithmeticException: 0으로 나누기 같은 산술 예외
- NumberFormatException: 문자열을 숫자로 바꾸는 데 실패할 때
- NullPointerException: null 값을 잘못 참조할 때
- IOException: 입출력 오류가 발생했을 때
- Exception: 모든 예외의 최상위 타입 (모든 예외를 catch할 수 있음)
📍 변수명 (두 번째)
- 예외 객체를 받아서 사용할 이름
- 일반적으로 e, ex, err처럼 짧게 많이 사용
- 이 변수로 예외 메시지나 스택 트레이스를 확인 가능
✅ 예외 처리 순서 & 원리
catch(NullPointerException e) { ... }
catch(IndexOutOfBoundsException e) { ... }
catch(Exception e) { ... }
이 순서가 중요한 이유:
- 자바는 위에서부터 catch 블록을 차례로 검사해서,
- 해당 예외와 일치하는 타입이 나오면 거기서 처리하고 나머지는 무시함.
- 그래서 Exception(모든 예외의 부모)은 맨 아래에 둬야 함
📌 예외 클래스는 상속 관계이기 때문에, 부모 타입이 위에 오면 자식 타입은 도달할 수 없는 코드가 돼서 컴파일 에러가 난다
💡 예외 처리의 핵심 개념
- try-catch는 **코드에서 컨트롤할 수 없는 상황(예외)**에 대해 프로그램을 멈추지 않고 흐름을 제어하기 위한 수단.
- Exception 클래스는 모든 예외의 부모 클래스라서 catch(Exception e)는 거의 모든 예외를 잡을 수 있음 (마지막 보루 같은 느낌).
- 대부분의 예외는 논리적으로 처리 가능한 경우가 많음 → 그렇기에 try-catch를 잘 써야 "안정성 확보"가 됨.
✨ 추가 팁
- e.printStackTrace() → 예외 발생 위치와 원인을 자세히 로그로 찍어줌 (개발 중에 유용!)
- e.getMessage() → 예외 메시지 간단히 확인
- 실무에서는 로깅 라이브러리(예: log4j, slf4j 등)로 예외 로그를 남김
✅ 1. 예외 전가 (throws)
📌 개념
예외 전가는 말 그대로 **예외 처리를 현재 메서드에서 하지 않고 호출한 쪽으로 "넘긴다"**는 의미
public void doSomething() throws Exception {
// 여기서 예외가 날 수도 있다는 걸 호출자에게 알림
throw new Exception("뭔가 잘못됐어");
}
📌 예시
public class Test {
public static void main(String[] args) {
try {
riskyMethod(); // 예외를 직접 처리해야 함
} catch (Exception e) {
System.out.println("예외 처리함: " + e.getMessage());
}
}
public static void riskyMethod() throws Exception {
throw new Exception("위험한 메서드야!");
}
}
💡 언제 쓰냐면?
- 현재 메서드에서 예외를 처리하지 않고, 나를 호출한 메서드에게 책임을 넘기고 싶을 때
- 보통 라이브러리, API, 또는 테스트 코드에서 자주 사용
✅ 2. 예외 직접 만들기 (사용자 정의 예외)
📌 개념
Java는 기본적으로 Exception과 그 하위 클래스를 제공하지만, 상황에 맞는 예외를 직접 정의할 수도 있음
📌 예시
class MyCustomException extends Exception {
public MyCustomException(String message) {
super(message);
}
}
public class Main {
public static void main(String[] args) {
try {
checkAge(15);
} catch (MyCustomException e) {
System.out.println("예외 발생: " + e.getMessage());
}
}
public static void checkAge(int age) throws MyCustomException {
if (age < 18) {
throw new MyCustomException("18세 미만은 가입할 수 없습니다.");
}
System.out.println("가입 가능!");
}
}
💡 언제 쓰냐면?
- 기본 제공 예외로는 상황을 정확히 표현할 수 없을 때
- 예: NotEnoughMoneyException, InvalidPasswordException 같은 상황별 예외가 필요할 때
'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글
| [JAVA] Thread,쓰레드 (1) | 2025.04.08 |
|---|---|
| [JAVA] 람다식(Lamda) (0) | 2025.04.07 |
| [JAVA] 인터페이스 (0) | 2025.04.07 |
| [JAVA] Linked List (3) | 2025.04.01 |
| [JAVA] 상속, 다형성 (0) | 2025.03.27 |