본문 바로가기

2022 여름방학 자바 스터디

[이것이 자바다] Ch10. 예외 처리

10.1. 예외와 예외 클래스

오류의 종류

1) 에러

- 하드웨어의 오동작 또는 고장으로 인한 실행 중지

- 에러가 발생되면 프로그램은 종료됨

- 정상 실행 상태로 돌아갈 수 없음

 

2) 예외

- 사용자의 잘못된 조작 혹은 개발자의 잘못된 코딩으로 인해 발생

- 예외가 발생되면 프로그램이 종료됨

- 예외 처리를 추가하면 정상 실행 상태로 돌아갈 수 있음

예외의 종류

1) 일반 예외 - Exception

- 예외 처리 코드가 없다면 컴파일 되지 않는 예외

 

2) 실행 예외 - Runtime Exception

- 예외 처리 코드를 생략하더라도 컴파일이 되는 예외

- 경험에 따라 예외 처리 코드를 작성할 필요가 있을 수도 있음

10.2. 실행 예외

10.2.1. NullPointException

- 객체 참조가 없는 상태, 즉 null 값을 갖는 참조변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생함

String data = null;
System.out.println(data.toString());

10.2.2. ArrayIndexOutOfBoundsException

- 배열에서 인덱스 범위를 초과하여 사용할 경우 발생

String[] arr = {"a", "b", "c"};
arr[5] // X

10.2.3. NumberFormatException

- 숫자로 변활될 수 없는 문자가 포함되어 있을 경우 발생

String data1 = "100";
String data2 = "a100";

int val1 = Integer.parseInt(data1);
int val2 = Integer.parseInt(data2); // X

10.2.4. ClassCastException

- 타입 변환이 되지 않을 경우 발생

10.3. 예외 처리 코드 (try-catch-finally)

- 예외가 발생했을 때, 프로그램 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드

- try-catch-finally 구문을 이용함

try {

	예외 발생 가능 코드;
    
} catch (예외 클래스 e) {

	예외 처리
    
} finally {

	항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
    
}

10.4. 예외 종류에 따른 처리 코드

10.4.1. 다중 catch

try {

	예외 발생 가능 코드;
    
} catch (예외 클래스 e) {

	예외 처리1
    
} catch (예외 클래스 e) {

	예외 처리2

} finally {

	항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
    
}

10.4.2. catch의 순서

!순서 주의! -- 구체적인 예외를 잡을 때

try {

	예외 발생 가능 코드;
    
} catch (Exception e) {

	예외 처리1           // 이 아래로는 catch 할 수 없음ㅡ얘를 제일 아래로
    
} catch (ArrayIndexOutOfBoundsException e) {

	예외 처리2           // [X]

} finally {

	항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
    
}

10.4.3. 멀티 catch

- 자바7부터 가능

- 하나의 catch 블록에서 여러 개의 예외 처리 가능

try {

	예외 발생 가능 코드;
    
} catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {

	예외 처리1           // 이 두 예외는 똑같이 처리하고 싶다
    
} catch (Exception e) {

	예외 처리2           

} finally {

	항상 실행; // 옵션임, 예외가 발생을 해도 안 해도 실행
    
}

10.5. 자동 리소스 닫기

try-with-resources

- 예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력스트림, 서버소켓, 소켓, 각종 채널)의 close() 메소드를 호출해서 안전하게 리소스를 닫아준다.

- 리소스 객체의 조건?

: java.lang.AutoCloseable 인터페이스를 구현하고 있어야 함

try(FileInputStream fis = new FileInputStrean("file.txt")) {
	....
} catch(IOException e) {
	....
}

10.6. 예외 떠넘기기

throws

- 메소드 선언부 끝에 작성

- 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할

public static void main(String[] args) {
    try {
        findClass();
    } catch(ClassNotFoundException e) {
        System.out.println("클래스가 존재하지 않습니다.");
    }

}

public static void findClass() throws ClassNotFoundException {
    Class clazz = Class.forName("java.lang.String2");
}

10.7.  사용자 정의 예외와 예외 발생

10.7.1. 사용자 정의 예외 클래스 선언

- 자바 표준 API에서 제공하지 않는 예외

- 애플리케이션 서비스와 관련된 예외

: 잔고 부족, 계좌 이체 실패, 회원 가입 예외 등

- 필요에 따라 예외 클래스를 만들어서 쓸 수 있어야 함

public class XXXException extends [Exception | RuntimeException]{  // 둘 중 선택
    public XXXException() {} // 기본 생성자 추가
    public XXXException(String message) {
    	super(message); // 부모 클래스의 생성자를 호출하는 것
    } // 예외가 왜 발생했는지에 대한 메시지 정보
}

10.7.2. 예외 발생시키기

!주의!

throw : 예외를 발생시키는 것

throws : 예외를 떠넘기는 것

throw new XXXException();
throw new XXXException("메시지");
public void method() throws XXXException{
    throw new XXXException("메시지");
}

10.8. 예외 정보 얻기

getMessage()

- 예외를 발생시킬 때 생성자 매개값으로 사용한 메시지를 리턴

- 좀더 상세 원인을 세분화하기 위해 예외 코드를 포함

: 예시-데이터베이스 예외 코드, 번호에 맞게 처리 가능

- catch() 절에서 활용함

catch(Exception e){
    String message = e.getMessage();
}

printStackTrace()

- 예외 발생 코드를 추적한 내용을 모두 콘솔에 출력

- 프로그램을 테스트하면서 오류를 찾을 때 활용

- 개발할 때 주로 사용