지식조각모음
8. 예외처리 본문
01. 프로그램 오류
- 프로그램 에러프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우, 이런 결과를 초래한 원인
- 에러의 종류
- 컴파일 에러: 컴파일 시에 발생하는 에러
- 런타임 에러: 실행 시에 발생하는 에러
- 논리적 에러: 실행은 되지만, 의도와는 다르게 동작하는 것
- 창고의 재고가 음수가 되는 경우
- 게임 프로그램에서 아이템을 먹고 죽는 경우
- 에러 발생 방식
- 컴파일러가 소스코드(*.java)에 대해 기본적인 검사를 수행
- 이 경우 문제가 발생하면 컴파일 에러
- 컴파일이 성공하면 클래스 파일(*.class)이 생성
- 클래스 파일 실행
- 이 경우 문제가 발생하면 런타임 에러
- 컴파일러가 소스코드(*.java)에 대해 기본적인 검사를 수행
- 런타임 에러의 구분
- 에러(error): 프로그램 코드에 의해서 수습될 수 없는 심각한 오류. 발생하면 복구 불가능
- 예외(exception): 프로그램 코드에 의해서 수습될 수 있는 미약한 오류
02. 예외 클래스의 계층구조

- Exception과 Error 클래스로 나뉘고 Exception 클래스는
- RuntimException(unchecked)과 Other Exception(checked)으로 나뉜다
Error
public class Error extends Throwable
클래스는Throwable클래스의 subclass이며, 일반적인 application에서 try-catch로 잡지 못하는 심각한 문제를 뜻한다. 에러는 비정상적인 조건이기 때문에 절대 발생하면 안된다. 에러는 compile-time 중 예외처리를 목적으로 하기 때문에unchecked excption으로 간주된다.Exception
public class Exception extends ThrowableThe class Exception and any subclasses that are not also subclasses of RuntimeException are checked exceptions. Checked exceptions need to be declared in a method or constructor's throws clause if they can be thrown by the execution of the method or constructor and propagate outside the method or constructor boundary.
Exception 클래스와 RuntimeException의 하위 클래스가 아닌 모든 하위 클래스는 checked exception 이다. Checked exception은 메소드나 생성자의 실행도중 던져지고, 그 경계 밖으로 전파가 가능한 경우 throws절에서 선언되어야 한다.
결론
- Error와 RuntimeException은 unchecked exception
- 그 외 Exception은 checked exception
03. Exception과 RuntimeException
- Exception 클래스들
- 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
- FileNotFoundException, ClassNotFoundException 등
- RuntimeException 클래스들
- 프로그래머의 실수로 발생하는 예외
- ArrayIndexOutOfBoundsException, NullPointException 등
04~05. 예외 처리하기
- 예외처리(exception handling)이란정의: 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것 - 예외처리 구조
try {
// 예외 발생 가능성이 있는 모든 문장
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리할 문장
} catch (Exception2 e2) {
} catch (ExceptionN eN) {
}예외가 발생하면 발생한 예외의 종류와 일치하는 단 한 개의 catch 블럭을 찾고, 그 catch 블럭 내의 문장들을 수행하고 try-catch 문을 빠져나간다. 일치하는 블럭이 없으면 예외는 처리되지 않고 JVM의 예외처리기(UncaughtExceptionHandler)가 받아서 예외의 원인을 화면에 출력한다.
06. 예외의 발생과 catch 블럭
class Ex8_2 {
public static void main(String args[]) {
try {
System.out.println(0/0); // Exception 발생
} catch (ArithmeticException ae) {
System.out.println("ArithmeticException");
} catch (Exception e) {
System.out.println("Exception");
}
}
}예외 발생시 처리 과정
- 예외 발생 시, 발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다.
- catch 블럭의 괄호 내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof연산자를 이용해서 검사
- 검사결과가 true인 블럭을 찾으면 catch 블럭의 내용 수행
10. checked예외, unchecked 예외
- checked 예외
- 컴파일이 완료되지 않음
- 예외처리가 되어 있지 않는 에러
- unchecked 예외
- 컴파일 완료
- 예외처리를 하지 않아도 컴파일 완료
17. 예외 되던지기(exception re-throwing)
한 메서드에서 발생할 수 있는 예외가 여럿인 경우, 몇 개는 try-catch문을 통해서 메서드내에서 자체적으로 처리하고, 그 나머지는 선언부에서 지정하여 호출한 메서드에서 처리하도록 함으로써, 양쪽으로 나눠서 처리하도록 할 수 있다.
- 예외 되던지기: 예외를 처리한 후에 인위적으로 다시 발생시키는 방법
- 언제 사용하지?
- 하나의 예외에 대해서 예외가 발생한 메서드와 이를 호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용된다.
- 왜 사용하지?
- 참고: https://www.ibm.com/support/pages/best-practice-catching-and-re-throwing-java-exceptions이런 일을 방지하기 위해 예외처리를 잘 해줘야 하고 그 일환으로 예외 되던지기가 있다. (까지만 이해함!)
- Problem determination is often hampered by mysterious errors, misleading information, or missing stack traces.
종종 알수없는 오류, 잘못된 정보, stack traces 누락으로 인해 문제를 파악하는데 방해가 발생할 수 있다.
18. 연결된 예외(chained exception)
원인 예외
try {
startInstall(); // SpaceException 발생
copyFiles();
} catch (SpaceException e) {
InstallException ie = new InstallException("설치중 예외발생"); // 예외 생성
ie.initCause(e); // InstallException의 원인 예외를 SpaceException으로 지정
throw ie; // InstallException을 발생시킨다.
} catch (MemoryException me) {
...-> InstallException은 SpaceException에 의해 발생했다.
왜 원인예외를 등록해서 다시 예외를 발생 시킬까?
참고: https://docs.oracle.com/javase/tutorial/essential/exceptions/chained.html
An application often responds to an exception by throwing another exception. In effect, the first exception causes the second exception. It can be very helpful to know when one exception causes another. Chained Exceptions help the programmer do this.
여러가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
SpaceException과 MemoryException의 조상인 InstallException으로 catch블럭을 작성하면 실제로 어떤 예외가 발생했는지 알 수 없다. 위의 예제에서 달라진 점은 catch문의 예외를 어떤 클래스로 썼는지이다. 이 경우 SpaceException이 발생해도 어떤 exception인지 알 수 없다.
try { startInstall(); // SpaceException 발생 copyFiles(); } catch (InstallException e) { e.printStackTrace(); }
checked예외를 unchecked예외로 바꿀수 있다.
- checked 예외가 발생해도 예외를 처리할 수 없는 상황이 발생 -> 무의미한 try-catch문 추가
- 이런 상황을 방지하기 위해 예외처리를 선택적으로 하기 위해 unchecked 예외로 변경
'책 > 자바의 정석' 카테고리의 다른 글
| Comparator와 Comparable (1) | 2022.03.10 |
|---|---|
| 11. 컬렉션 프레임웍 (0) | 2022.03.06 |
| 10. 날짜와 시간 & 형식화 (1) | 2022.03.05 |
| 9. java.lang 패키지와 유용한 클래스 (0) | 2022.03.03 |
| Chapter 5. 배열 (3) | 2022.02.16 |