반응형
예외(exception)
- 사용자의 잘못된 조작 또는 개발자의 잘못된 코드로 인해 발생하는 프로그램 오류
- 발생 시 프로그램이 곧바로 종료되는데,
예외 처리(exception handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태를 유지할 수 있음 - 자바에서는 예외가 발생할 가능성이 높은 코드를 컴파일할 때 예외 처리 유무 확인(모든 예외를 확인하는 것은 아님)
-> 예외 처리 코드가 없다면 컴파일되지 않음
1. 예외 클래스
- 자바에서는 예외를 클래스로 관리
-> 프로그램 실행 도중 예외 발생 시, JVM에서 해당 예외 클래스로 객체를 생성해야 예외 처리 코드에서 예외 객체 이용 - 모든 예외 클래스는 java.lang.Exception 클래스를 상속받음
1) 예외와 예외 클래스
(1) 일반 예외(컴파일러 체크 예외, exception)
- 프로그램 실행 시 예외가 발생할 가능성이 높으므로 자바 소스 컴파일 과정에서 해당 예외 처리 코드 유무 검사
(2) 실행 예외(컴파일러 넌[non] 체크 예외, runtime exception)
- 프로그램 실행 시 예측할 수 없이 갑자기 발생하므로, 자바 소스 컴파일 과정에서 예외 처리 코드 유무를 검사하지 않음
2) 실행 예외
- 자바 컴파일러가 체크하지 않으므로, 오로지 개발자의 경험으로 예외 처리 코드 작성
-> 만약 개발자가 예외 처리 코드를 작성하지 않았다면, 실행 예외 발생 시 프로그램 종료
(1) NullPointerException
- 객체 참조가 없는 상태에서 객체를 사용하려 했을 때의 예외
- null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생
(2) ArrayIndexOutOfBoundsException
- 배열에서 인덱스 범위를 초과할 경우의 예외
- 예시로 길이가 3인 배열 arr을 선언했을 경우, arr[3]을 사용했을 때 발생
(3) NumberFormatExceptioin
- 문자열를 숫자로 변환하는 메서드들을 사용할 때, 문자열에 숫자로 변환될 수 없는 게 포함되어 있을 때의 예외
(4) ClassCastException
- 상위클래스-하위클래스, 구현클래스-인터페이스 간의 관계가 아닌데, 클래스를 다른 타입으로 형변환하려 할 시의 예외
2. 예외 처리
- 자바 컴파일러는 소스 파일 컴파일 시,
일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 강제적으로 예외 처리 코드를 작성하도록 요구
-> 자바 컴파일러가 실행 예외는 체크해주지 않으므로 예외 처리 코드를 작성해야 함 - 실무에서 예외 클래스는 보통 Exception을 사용: 모든 예외를 확인 가능하기 때문
1) 예외 처리 코드(try-catch-finally 블록)
try {
// 예외 발생 가능 코드
} catch(Exception e) {
// 예외 발생 가능 코드에서 예외가 발생했을 때: 예외 처리
e.printStackTrace(); // 예외의 상세 정보 출력
} finally {
// 항상 실행하는 코드;
}
*다중 예외 처리 시(구체적인 예외를 구분해서 처리하는 것이 유지보수에 유리)
try {
// 예외 발생 가능 코드
} catch (IOException e) {
// 입출력 관련 예외 처리
e.printStackTrace(); // 예외의 상세 정보 출력
} catch (SQLException e) {
// DB 관련 예외 처리
e.printStackTrace(); // 예외의 상세 정보 출력
} catch (Exception e) {
// 그 외 예상치 못한 예외 처리 (로그 남기기 등)
e.printStackTrace(); // 예외의 상세 정보 출력
}
2) 예외 떠넘기기(throws)
- 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김
-> 예외를 해당 메서드에서 직접 처리하지 않고, 메서드를 호출한 쪽에서 예외 처리를 책임지도록 위임
리턴타입 메서드이름(매개변수, ...) throws Exception {
}
반응형
'자바(JAVA) > 미니 프로젝트 & 기초 공부' 카테고리의 다른 글
Java 기초 또 다시 공부하기 16일차 - 기본 API 클래스(java.lang 패키지) (2) | 2025.06.20 |
---|---|
Java 기초 또 다시 공부하기 14일차 - 중첩 클래스와 중첩 인터페이스(중첩 클래스와 중첩 인터페이스 개요, 익명 객체) (1) | 2025.06.17 |
Java 기초 또 다시 공부하기 13일차 - 인터페이스, 인터페이스의 타입 변환과 다형성 (3) | 2025.06.16 |
Java 기초 또 다시 공부하기 12일차 - 상속(추상 클래스와 추상 메서드) (1) | 2025.06.13 |
Java 기초 또 다시 공부하기 11일차 - 상속(상속, 클래스의 타입 변환과 다형성) (1) | 2025.06.12 |