파워자바 15장 예외처리

파워자바 15장 예외처리

1. 예외처리란?

오류(error)
    – 0으로 나눈다(잘못된 연산)
    – 한계를 넘은 배열의 인덱스
    – 디스크의 하드웨어 에러
    – 필요한 파일 누락

오류(error)의 다른 이름 : 예외(Exception)

예외처리 : 오류를 감지하여 프로그램 종료, 오류를 처리후 실행지속

예외도 하나의 객체로 취급 -> 예외 객체 (Exception object)

던지다(throw) : 예외 객체의 생성
잡는다(catch) : 예외를 잡는다.

버그와 예외 : 자바에서는 버그도 예외로 취급하지만, 버그는 개발 과정에서 모두 수정되어야 하는 부분임. 진정한 의미에서의 예외는 ‘예상하지 못했던 상황’을 의미함.

2. 예외처리기의 개요

try{
    //대상 코드

}catch([예외종류] [참조변수]){
    //예외 처리 내용

}

예외 발생 차단 : 미리 데이터를 테스트해서 예외가 일어나지 않도록 조치.
ex) 나누기 전에 분모가 0인지 미리 검사, Scanner의 scan.nextInt()를 쓰려면 scan.hasNextInt()가 true일 때만 실행.

finally 블록 : 오류가 발생하였건 발생하지 않았던 항상 실행되어야 하는 코드

3. 예외의 종류

자바에서는 오류가 발생하면 예외 객체가 생성된다. 예외 객체는 Throwable로부터 파생되는 여러 클래스들의 인스턴스이다.

Error와 Exception : 모든 예외는 Throwable로부터 상속되어서 Error와 Exception이라고 하는 두 개의 클래스로 나눠진다.
Error란 시스템에서 발생하는 심각한 오류이다. Exception은 프로그래밍 시에 흔히 발생하는 일반 오류를 말한다. Exception은 RuntimeException과 IOException으로 나뉜다. RuntimeException은 실행 중 어느때라도 발생될 수 있는 에러이며, 발생하면 100% 프로그래머 잘못인 프로그래머 버그이다.

체크 예외와 비체크 예외 : RuntimeException은 비체크 예외(unchecked exceptions)이라고도 한다. 컴파일러는 비체크 예외를 예방했는지 확인하지 않으므로, 코드에서 반드시 예방하지 않아도 된다.
반면 체크 예외(checked exceptions)는 그 밖의 모든 예외이다. 체크 예외는 코드에서 반드시 처리해주어야 한다.

다형성과 예외: 예외를 처리할 때에 상위 클래스를 이용하면 하위 클래스까지 포괄적으로 처리할 수 있다.
ex) NumberException을 활용하면 하위 클래스인 TooBigException, TooSmallException 모두 잡을 수 있다.
다만 Exception e 는 하위 클래스를 잡을 수 있으나 분간할 수 없다.

4. 예외와 메소드
키워드 throws는 메소드가 발생할 수 있는 예외들을 나열하는데 사용된다.

예외 발생 메소드 예제 : 예외처리를 하는 방법에는 두 가지가 있다.
(1) try~catch 절은 예외를 그 자리에서 처리한다.
(2) public [형] [메소드명] throws [예외종류]는 예외를 상위 메소드로 전달한다.
※ 메소드의 호출 순서는 호출 스택(call stack)에 의하여 기억된다. 그러므로 메소드가 종료되어도 되돌아갈 메소드를 찾을 수 있다.

5. 예외 생성하기

예외 던지고 받기: 자바에서의 예외는 throw문을 이용하여 발생된다. throw문의 인수는 Throwable에서 파생된 어떤 클래스의 객체라도 가능하다.

사용자 정의 예외: 사용자도 예외 객체를 정의할 수 있다. 보통 Exception 클래스의 서브 클래스를 생성시켜서 만든다.
ex) public class [Exception명] extends Exception {}

여러 개의 예외를 주고 받는 방법: 메소드가 여러 개의 예외를 발생/전달하려면 컴마를 이용하여 예외를 throws 다음에 나열하면 된다.
ex) public void [메소드명] throws NetworkException, DiskException