개발자 도전기
[JAVA] 예외(Exception) 본문
예외와 예외 클래스
Java에서 예외 처리는 프로그램 실행 중에 발생할 수 있는 예외나 오류 상황을 적절히 처리하는 메커니즘이다.
모든 예외처리는 Throwable 클래스를 상속받는다.
Throwable을 상속 받는 클래스로는 Exception과 Error가 있다.

- Error : 프로그램 코드로는 복구할 수 없는, 개발자가 대처할 수 없는 오류를 말한다.
- Exception : 프로그램 실행 중 발행할 수 있는 잘못된 사용 또는 코딩으로 인한 오류를 말한다.
예외가 발생하면 프로그램이 곧바로 종료되지만, 예외 처리를 하면 계속 실행 상태를 유지할 수 있다.
예외 클래스는 java.lang.Exception을 상속받아 만들어진다.
Exception을 상속받는 예외에는 다음 두 가지가 있다.
- 일반 예외 (Exception) : 컴파일러가 예외 처리 코드 여부를 검사하는 예외를 말함
컴파일러가 예외 처리를 검사하기 때문에 checked exception이라고 하며 예외 처리 코드를 반드시 포함해야 한다.
- 실행 예외 (Runtime Exception) : 컴파일러가 예외 처리 코드 여부를 검사하지 않는 예외를 말함
컴파일러가 예외 처리를 검사하지 않기 때문에 unchecked exception이라고 하며 예외 처리 코드를 포함하지 않아도 된다.
예외 처리 코드
- 프로그램 실행 중 예외가 발생하면 자바가상머신(JVM)은 Exception 클래스의 객체를 생성하여 프로그램으로 넘기게 된다.
- 예외를 발생시킨 프로그램이 예외객체를 catch 하여 처리하게 된다
- 예외처리를 하지 않으면 프로그램은 종료한다.
예외 처리 코드는 try - catch - finally 블록으로 구성된다.
try 블록에서 작성한 코드가 예외 없이 실행되면 catch 블록은 실행되지 않는다try 블록에서 예외가 발생하면 catch 블록이 실행된다.finally 블록은 예외와 상관 없이 무조건 실행된다
public class Main {
public static void main(String[] args) {
try {
int result = divide(10, 0);
System.out.println("결과: " + result);
} catch (ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
} finally {
System.out.println("finally 블록 실행");
}
}
public static int divide(int num1, int num2) {
return num1 / num2;
}
}
0으로 나눌 수 없습니다
finally 블록 실행
위 예제에서는 try 블록에서 ArithmeticException이 발생했기 때문에 catch 블록에서 예외를 처리했고 finally 블록은 예외 처리와 상관없이 항상 실행된다.
And
- catch 블록은 여러 개로 작성할 수 있다.
- catch 블록이 여러 개라 할지라도 하나의 예외는 하나의 catch 블록만 실행시킨다
- 여러 예외 클래스들이 상속 관계에 있을 때는 상위 클래스 catch 블록을 가장 나중에 작성한다.
- 두 개 이상의 예외를 하나의 catch 블록으로 예외 처리할 때는 기호
|로 연결한다.
예외 떠넘기기
- 메소드 내부나 생성자에서 예외가 발생할 때 try-catch 블록으로 예외를 처리하지 않고
throws를 사용하여 메소드를 호출한 곳으로 예외를 떠넘길 수 있다. - throws는 메소드 선언부 끝에 작성한다
- 떠넘길 예외 클래스가 여러개일 경우 쉼표로 구분한다
- 예외를 떠넘긴 후 메소드를 호출한 곳에서 예외를 떠넘기거나 try-catch로 처리해야 한다.
- main 메소드에서 예외를 떠넘길 경우 JVM이 최종적으로 예외 처리를 한다
리턴타입 메소드명(매개변수, ...) throws Exception {
}
사용자 정의 예외
개발자가 직접 Exception 클래스를 상속받는 예외 클래스를 정의하여 사용자 정의 예외를 만들 수 있다
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
public CustomException() {}
}
try {
throw new CustomException("사용자 정의 예외 발생");
} catch (CustomException e) {
System.out.println(e.getMessage());
}
사용자 정의 예외를 만들 때 매개변수를 포함한 생성자를 만들게 되면 기본 생성자를 사용하지 못하니 기본 생성자도 함께 생성해준다.
'개발공부 > JAVA' 카테고리의 다른 글
| [JAVA] I/O Stream (2) | 2024.03.27 |
|---|---|
| [JAVA] 멀티 스레드 (0) | 2024.03.26 |
| [JAVA] 수정할 수 없는 컬렉션 (0) | 2024.03.21 |
| [JAVA] Stream API (0) | 2024.03.21 |
| [JAVA] Stack, Queue (0) | 2024.03.20 |