"이것이 자바다" 정리 10장 예외 처리

2023. 2. 28. 15:23자바/이론 공부

이 게시글은 내가 "이것이 자바다" 책을 읽고 노트에 정리해놨던 내용들을 검색하기 쉽게 데이터로 백업하는 용도의 글이다.

 

문제가 된다면 삭제하겠음.

 

 

 

10장 예외 처리

 

 

 

*에러 : 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것.

 - JVM 실행에 문제가 생겼다는 뜻.

 

 

*오류 : 자바에서 에러 이외의 예외.

 - 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류

 - 예외는 예외 처리를 통해 프로그램을 종류하지 않고 정상 실행 상태가 유지되도록 할 수 있음.

 

 

*예외의 종류

 - 일반 예외(컴파일러 체크 예외) : 컴파일 과정 중 예외 처리 코드 체크. 예외 처리 코드가 없다면 컴파일 오류가 발생한다. (예를 들어 우리가 int a="java"; 라는 코드를 짰을 때 왼쪽에 빨간 불이 들어오며 에러처리 나는 것이 이에 해당한다.)

 - 실행 예외 : 컴파일 과정 줄 예외 처리 코드를 검사하지 않음. (컴파일러가 예외 처리 코드를 체크하지 않기 때문에 이클립스에서 빨간 밑줄이 생기지 않는다.)

 

 - 실행 예외는 예외 처리 코드를 검사하지는 않지만 에러는 동일하게 나고 에러가 나지 않게 하기 위해서는 두 가지 예외 모두 예외 처리가 필요함.

 

 

*모든 예외 클래스들은 java.lang.Exception 클래스를 상속받는다.

 

 

*일반 예외와 실행 예외 클래스를 구별하는 방법

 - 일반예외는 Exception을 상속받지만 RuntimeException을 상속받지 않음.

 - 실행 예외는 RuntimeException을 상속받음. ( RuntimeException 또한 Exception 을 상속받음.)

 

 

*주요 실행예외

1. NullPointerException

 - 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수를 사용하려고 했을 때 나타나는 예외. (객체가 null값을 갖고 있으면 객체를 참조하지 않음.)

 

2. ArrayIndexOutOfBoundsException

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

 

3. NumberFormatException

 - 문자열로 되어 있는 데이터를 숫자로 변경할 때, 숫자로 변환될 수 없는 문자가 포함되어 있다면

 

4. ClassCastException

 - 상속 관계와 구현 관계가 아닌데 타입 변환을 시도할 경우

 

 

*예외 처리 코드

 - 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드

 - 예외 처리 코드는 try-catch-finally 블록을 이용한다.

 - try 블록에는 예외 발생 가능 코드가 위치한다.

 - catch 블록에는 예외 처리 코드가 들어있다.

 - finally 블록에는 try와 catch 상관없이 항상 실행되어야하는 코드가 위치한다.

 

 - try에서 예외발생 시 즉시 실행을 멈추고 catch블럭으로 이동한다. try에서 예외가 발생하지않으면 catch 블럭을 실행시키지않는다.

 

 

*다중 catch

 - 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다.

 - 예외를 처리해줄 catch 블록은 위에서부터 차례대로 검색되기 때문.

 

 

*멀티 catch

 - catch 괄호 () 안에 동일하게 처리하고 싶은 예외를 | 로 연결하면 된다.

try{
	...
}catch(예외1 | 예외2){
	...
}catch(Exception e){
	...
}

 

 

*자동 리소스 닫기 (리소스 : 데이터를 읽고 쓰는 객체. FileInputStream 같은)

 - try-with-resources를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체의 close() 메소드를 호출해서 안전하게 리소스를 닫아준다.

 - try-with-resources를 사용하지 않으면 finally에서 close를 항상 확인해줬어야함.

 - try-with-resources는 try에 자원 객체를 전달하면, try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능

 - try-with-resources를 사용하기 위한 조건 : 리소스 객체(try에 전달할 자원)는 java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다. (closeable 인터페이스에 부모 인터페이스인 AutoCloseable을 추가해주면서 하위 클래스 수정없이 호환가능하다.)

 

try(
    FileInputStream fis= new FileInputStream("file1.txt");
    FileOutputStream fos=new FileOutputStream("file2.txt")
){
    ...
} catch ( IOException e) {
}

 

 -AutoCloseable에는 close() 메소드가 정의되어 있음

 =>try-with-resources가 이 close() 메소드를 자동 호출해줌.

 

 

* 예외 떠넘기기

 - 보통은 try-catch 블록으로 예외를 처리하지만, 경우에 따라서 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.

 => throws를 사용하면 된다.

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

 - throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 함. 그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야함!!

 

 

*사용자 정의 예외

 - 애플리케이션 서비스와 관련된 예외를 애플리케이션 예외(=사용자 정의 예외)라고 함. ( 자바의 표준 API에서는 제공하지 않는)

 - 컴파일러가 체크하는 일반 예외로 선언할 수도 있고 컴파일러가 체크하지 않는 실행 예외로 선언할 수도 있음.

 - 일반 예외로 선언할 경우 Exception 상속.

 - 실행 예외로 선언할 경우 RuntimeException 상속.

 - 사용자 정의 예외 클래스는 대부분 생성자 선언만을 포함한다.

 - 생성자는 보통 두 개를 선언한다. (매개변수가 없는 기본 생성자예외 발생 원인 메시지를 전달하기 위한 String타입의 매개 변수를 갖는 생성자)

 - 생성자는 아무거나 원하는 것으로 이용하면 된다.

 - 예외 발생 코드를 가지고 있는 메소드는 대부분 자신을 호출한 곳에서 예외를 처리하도록 throws 키워드로 예외를 넘긴다.

 

 

* 예외 정보 얻기

 - getMessage() : 예외 메시지 내용 출력.

 - printStackTrace() : 어떤 예외가 어디에서 발생했는지 상세하게 출력해줌.