Java Mid 10 - Exception 1
in Programming Language on Java
예외 처리가 필요한 이유
프로그램 실행 중에 발생할 수 있는 예상치 못한 상황, 즉 예외(Exception)을 처리하기 위해서 나온 메커니즘이 예외처리이다. 프로그램의 안정성과 신뢰성을 높이는 아주 중요한 역할을 한다.
자바 예외 키워드
try, catch, finally, throw, throws
- Object: 자바에서 기본형을 제외한 모든 것은 객체이다. 예외도 객체
- 모든 객체의 어머니 아버지는 Object이므로 예외도 Objcet가 최상위 부모이다.
- Thorable: 최상위 예외이다. 하위에 Excepiton과 Error가 존재한다.
- Error: 메모리 부족 및 심각한 시스템 오류와 같이 애플리케이션이 복구가 불가능한 시스템이다. 이 예외는 잡기가 힘들다.
- Exception: 체크 예외: 컴파일러가 체크하는 체크예외이다.
- RuntimeException: 언체크 예외, 런타임 예외, 컴파일러가 체크하지 않는 예외이다.
- RuntimeException` 과 그 자식 예외는 모두 언체크 예외이다.
체크 예외 vs 언체크 예외(런타임 예외)
체크 예외는 발생한 예외를 개발자가 명시적으로 처리해야 한다. 그렇지 않으면 컴파일 오류가 발생한다. 언체크 예외는 개발자가 발생한 예외를 명시적으로 처리하지 않아도 된다.
체크 예외 (Checked Exception)
import java.io.*;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
// 체크 예외: FileNotFoundException
FileReader file = new FileReader("nonexistentfile.txt");
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
}
}
}
언체크 예외 (Unchecked Exception)
public class UncheckedExceptionExample {
public static void main(String[] args) {
// 언체크 예외: ArithmeticException
int result = 10 / 0;
System.out.println("결과: " + result);
}
}
- 체크 예외는
FileNotFoundException처럼 반드시try-catch로 처리하거나 메서드 선언부에throws로 명시해야 컴파일 오류가 발생하지 않는다. - 언체크 예외는
ArithmeticException처럼 처리하지 않아도 컴파일이 가능하지만, 실행 시 예외가 발생한다.
예외 기본 규칙
예외는 폭탄 돌리기랑 비슷하다. 잡아서 처리하거나 처리하지 못한다면 밖으로 던져야 한다. (여기서의 밖은 호출한 곳을 말한다.)
예외를 잡으면 지정된 예외뿐만이 아닌 그 예외의 모든 자식들이 가진 예외도 잡을 수 있다. 예를 들어서 Exception을 catch로 잡으면 그 하위 예외들도 모두 잡을 수 있다. 또는 thorws로 던진다면 그 하위 예외들 또한 모두 잡을 수 있다.
thorw와 thorws의 차이(까다로웠음)
thorw
- 프로그래머가 의도적으로 예외를 던질 때 사용
public class ThrowExample {
public static void main(String[] args) {
// 직접 예외를 발생시킴
throw new NullPointerException("예외가 발생했습니다!");
}
}
thorws
- 메서드가 체크 예외를 발생시킬 수 있음을 선언할 때 사용한다(예외 가능성이 있음).
import java.io.*;
public class ThrowsExample {
// 메서드가 FileNotFoundException을 던질 수 있음을 선언
// 예외가 발생할 수 있는 가능성을 적어둠
public static void readFile() throws FileNotFoundException {
FileReader file = new FileReader("nonexistentfile.txt");
}
public static void main(String[] args) {
try {
readFile();
} catch (FileNotFoundException e) {
System.out.println("파일을 찾을 수 없습니다: " + e.getMessage());
}
}
}
throw는 직접 예외를 발생시키는 데 사용된다.throws는 메서드에서 예외가 발생할 수 있음을 선언하는 데 사용된다.
쉽게 설명하자면
throw는 예외를 던지는 동작 자체를 의미해. 즉, 코드에서 “이 예외를 발생시켜라”라고 명령하는 것throws는 이 메서드에서 이런 예외가 발생할 수 있다고 미리 알려준다. 예외를 던질 수도 있으니까 호출한 쪽에서 준비하라는 뜻이다.
Referrence
인프런 김영한님의 자바 강의 + 나의 눈과 나의 뇌