Backend/JAVA-자바
JAVA 11. 예외처리 (try-catch / throws / try-with-resources)
사랑짱
2021. 6. 24. 21:20
◆ 오류의 종류
- 에러(Error) : 하드웨어의 잘못된 동작 또는 고장으로 인한 오류
- 예외(Exception) : 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인한 오류
※ 에러와 예외 비교
- 공통점 : 발생되면 프로그램 종료
- 차이점 : 에러(Error)는 정상 실행 상태로 돌아갈 수 없다.
예외(Exception)는 예외처리를 추가하여 정상 실행 상태로 돌아갈 수 있다.
따라서, 개발자는 우리가 처리해야 할 예외(Exception)에 집중해야한다!
◆ 예외의 종류
- 일반 예외(Checked Exception) : 예외처리 코드 없으면 컴파일 오류 발생(컴파일 시 체크)
- 실행 예외(RuntimeException) : 예외처리 코드를 생략하더라고 컴파일이 되는 예외
경험에 따라 예외처리 코드 작성 필요
※ 프로그램의 안정성을 확보하기 위해 예외처리 작업은 매우 중요하다!!!
◆ 예외 클래스의 구조
- 예외 처리의 최상위 클래스 : Throwable class
- Throwable class를 상속받는 하위클래스
(1) Error class
(2) Exception class : Checked Exception, RuntimeException(★)
- Checked Exception : 반드시 예외처리를 작성해야 컴파일 가능 --> try-catch 를 꼭 해야 한다!
- RuntimeException : 컴파일러가 개입하지 않으며, 개발자 경험에 의해 작성해야 한다.
Checked Exception | RuntimeException | |
처리 여부 | 반드시 예외 처리 해야함 | 예외 처리하지 않아도 됨 |
트랜잭션 Rollback 여부 | Rollback 안됨 | Rollback 진행 |
대표 Exception | IOException, SQLException |
NullPointerException, IllegalArgumentException |
◆ 실행 예외(RuntimeException)의 종류
다양한 실행 예외의 종류가 있으나 대표적인 예외에 대해 알아보자.
- NullPointerException : 객체 참조가 없는 상태(참조변수가 비어있을 때)
- ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과하여 사용하는 경우 발생
- ClassCastException : 상속관계에서 타입 변환이 되지 않을 경우 발생
◆ 예외 처리 코드(try-catch-finally)
- 예외 발생 시 프로그램 종료를 막고, 정상 실행 유지할 수 있도록 처리
- catch문의 매개변수로 예외객체를 인자로 전달받아 catch문에서 사용하여 처리
▷ 정상 실행되었을 경우 : try문(예외 발생여부에 따라 실행)
▷ finally문- 예외 발생되었을 경우 : try문(예외 발생여부에 따라 실행) - catch문 - finally문
※ 예외 정보 얻기 (catch() 절에서 활용)
- getMessage( ) : 예외 발생 시 생성자 매개값으로 사용한 메시지를 리턴
- printStackTrace( ) : 예외 발생 코드 추적한 내용을 출력
◆ 다중 예외 처리 시 주의사항
- 다중 catch문 작성 시 상위클래스(Exception)로 처리하면
모든 예외가 처리되기 때문에 하위 예외처리를 할 필요가 없다.
다만, Exception이 가장 상위에 위치하면 어떤 예외인지 정확한 파악이 어렵다!!
따라서 예외처리는 하위 예외 -> 상위 예외 순으로 작성하고 Exception은 가장 나중에 작성하자!
※ Throwable 블록으로 처리할 수 있는 error도 있다!!
◆ 예외 떠 넘기기(throws)
- 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할
- 메소드 선언부 끝에 작성
◆ 사용자 정의 예외
- 자바 표준 API에서 제공하지 않는 예외
- application service와 관련된 예외 (대부분 CheckedException 으로 예외 처리)
Ex) 잔고 부족 예외, 계좌 이체 실패 예외, 회원 가입 실패 예외 등
※ 사용자 정의 예외 클래스 선언 방법
step 1. 예외의 종류 결정 - CheckedException | RuntimeException
step 2. 예외클래스 생성 (Constructor OverLoading)
- default constructor : 단순 예외 객체 생성할 때 사용하는 생성자
- constructor : 예외 메시지까지 함께 생성할 때 사용하는 생성자
step 3. 예외 발생시키기 (호출된 곳에서 발생한 예외를 처리하도록 예외 객체 생성)
◆ 자동 리소스 닫기(try-with-resources)
- 예외 발생 여부과 상관없이,
사용했던 리소스 객체의 close() 메소드를 호출하여 리소스를 닫음
try-catch문이 종료되면, resource도 함께(with) close()로 닫힌다!!
※ 리소스 객체
- java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.
<자바 8버전>
<자바 11버전>
※ try블록이 정상적으로 실행되었거나 도중에 예외가 발생하면 자동으로 close( )메소드가 호출!