10장-예외처리
생성일: 2021년 12월 31일 오후 2:15
10.1 예외와 예외 클래스
- 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는것을 에러라고 한다.
- 에러는 JVM 실행에 문제가 생겻다는 것이므로 프로그램을 아무리 견고하게 만들어도 실행 불가능하다.
- 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다.
- 예외는 예외처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.
일반예외
-컴파일러 체크 예외, 자바 소스를 컴파일 하는 과정에서 예외 처리 코드가 필요
지 검사 하기 때문이다.
-예외 처리 코드가 없다면 컴파일 오류가 발생한다.
실행예외
-컴파일 하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다.
- 컴파일 시 예외 처리를 확인하는 차이일 뿐, 두 가지 예외는 모두 예외 처리가 필요하다.
- 자바에서는 예외를 클래스로 관리한다.
일반 예외와 실행 예외 클래스를 구별하는 방법?
일반 예외는 Exception을 상속받지만, RuntimeException을 상속 받지 않는 클래스들이고,
실행 예외는 RunTimeException을 상속 받은 클래스들이다.
10.2 실행 예외
자바 컴파일러가 체크하지 않기 때문에 오로지 개발자의 경험에 의해서 예외 처리코드를 삽입해야 한다 .
→ 넣지 않았을 경우 해당 예외가 발생하면 프로그램은 바로 종료된다.
10.2.1 NullPointerException
객체 참조가 없는 상태, null값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을때 발생한다.
10.2.2 ArrayIndexOutOfBoundsException
배열에서 인덱스 범위를 초과하여 사용할 경우 실행 예외인 ArrayIndexOutOfBoundsException이 발생한다.
10.2.3 NumberFormatException
문자열을 숫자로 변경을 시도하다, 숫자로 변환 될 수 없는 문자가 포함되어 있다면 NumberFormatException이 발생한다.
반환타입
int
double
메소드명
integer.parseInt(String s)
Double.parseDouble(String s)
설명
주어진 문자열을 정수로 변환해서 리턴
주어진 문자열을 실수로 변환해서 리턴
10.2.4 ClassCastExcetpion
타입 변환은 상위 클래스와 하위 클래스 간에 발생하고 구현 클래스와 인터페이스 간에도 발생한다.
이러한 관계가 아닌 클래스 간의 타입 변환을 시도할때 ClassCastExcetpion이 발생한다.
Animal animal = new Dog();
Cat car = (Cat) animal; (x)
RemoteControl rc = new Television();
Audio audio = (Audio) rc;(x)
10.3 예외 처리 코드
- 프로그램에서 예외가 발생했을 경우 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드를 뜻한다.
- 자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 오류를 발생시켜
개발자로 하여금 강제적으로 예외 처리 코드를 작성하도록 요구한다. - 실행 예외는 컴파일러가 체크해주지 않기 때문에 예외 처리 코드를 개발자의 경험을 바탕으로 작성해야 한다.
(try-catch-finally)
정상 실행시 : 1 → 3
예외 발생시: 1→ 2 → 3
10.4 예외 종류에 따른 처리 코드
10.4.1 다중 catch
try 블록 내부는 다양한 종류의 예외가 발생할 수 있다.
catch 블록의 예외 클래스 타입은 try 블록에서 발생된 예외의 종류를 말하는데,
try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있다.
- catch 블록이 여러개라도 단 하나의 catch 블록만 실행된다.
(하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기때문)
10.4.2 catch순서
- 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치 해야 한다.
(try 블록에서 예외 발생시, 예외를 처리해줄 catch블록은 위에서부터 차례대로 검색되기 때문이다.)
잘못된 코드
10.4.3 멀티catch
한줄에 여러개의 에러를 잡는것을 의미함
정상 코드
10.5 자동 리소스 닫기
자바 7에서 새로 추가된 try-with-resources를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스를 닫아준다.
자바 6버전 이하 close처리방법
자바 7버전 이후 처리방법
- try{}에서 예외가 발생하면 우선 close()로 리소스를 닫고 catch 블록 실행
- 사용하기 위한 조건이 있는데, AutoCloseable 인터페이스를 구현하고 있어야함
*FileInputStream ← InputStream ← Closeable ← AutoCloseable
10.6 예외 떠넘기기
메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch블록으로 예외처리가 기본이지만, 경우에 따라서는 호출한 곳으로 예외를 떠넘길 수 있다.
이때 사용하는 키워드가 throws, throws키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
리턴타입 메소드명(매개변수) throws Exception{
}
throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 한다.
catch블록에서 떠넘겨 받은 예외를 처리 해야 한다.
public void method(){
try{
method2();
}catch (ClassNotFoundException e){
//처리
}
}
public void method2() throws ClassNotFoundException{
}
10.7 사용자 정의 예외와 예외 발생
자바 표준 api에서 제공하는 예외 클래스외에 개발자가 직접 정의해서 만드는 예외를 의미한다.
10.7.1 사용자 정의 예외 클래스 선언
- 컴파일러가 체크하는 일반예외로 선언할 수 있다 (Exception 상속)
- 컴파일러가 체크하지 않는 실행 예외로 선언할수도 있다(RuntimeException 상속)
- 사용자 정의 예외 클래스는 Exception으로 끝나는게 좋다.
- 생성자는 두개의 선언을 선언하는게 일반적인데, 하나는 매개변수가 없는 생성자와,
다른 하나는 예외 발생 원인메시지를 전달하기 위해 String 타입의 매개변수 생성자이다
public class BalanceInsufficientException extends Exception{
public BalanceInsufficientException(){}
public BalanceInsufficientException(String message){
super(message);
}
}
10.7.2 예외 발생시키기
throw new BalanceInsufficientException();
throw new BalanceInsufficientException("에러 메시지");
만약 catch 블록에서 예외 메시지가 필요하다면 예외 메시지를 갖는 생성자를 사용하면 된다.
예외가 발생하면 try-catch 블록으로 예외를 처리할 수 있지만, 대부분은 자신을 호출한 곳에서 예외를 처리하도록 throws 키워드로 예외를 넘긴다.
public void method1() throws BalanceInsufficientException{
throw new BalanceInsufficientException();
}
try{
method1();
}catch(BalanceInsufficientException e){
//
}catch(Exception e){
//
}
10.8 예외 정보 얻기
try 블록에서 예외가 발생되면 예외 객체는 catch 블록의 매개 변수에서 참조하게 되므로 매개 변수를 이용하여 예외 객체의 정보를 알 수 있다.
모든 예외 객체는 Exception 클래스를 상속하기 때문에, Exception이 가지고 있는 메소드들을 모든 예오 객체에서 호출 할 수 있다.
catch(BalanceInsufficientException error){
String message = error.getMessage();
message -> 메일받는다, slack 알람을 받는다
}
'책 > 이것이 자바다' 카테고리의 다른 글
[11장] 기본API클래스(2) (0) | 2022.02.14 |
---|---|
[11장]기본 API클래스 (0) | 2022.02.14 |
[9장]중첩 클래스와 중첩 인터페이스 (0) | 2022.02.14 |
[8장]인터페이스 (0) | 2022.02.14 |
[7장] 상속 (0) | 2022.02.14 |