Live-Study

[9주차] 예외 처리

youn12 2021. 2. 19. 16:13
✏️ Info.

- Excetpion 과 Error 학습

📋 List.

1. Exception과 Error의 차이는?
2. 자바가 제공하는 예외 계층 구조
3. RuntimeException과 RE가 아닌 것의 차이는?
4. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
5. 커스텀한 예외 만드는 방법


✔️ Content.

 

1. Exception과 Error의 차이는?

 

 

Error

  • 시스템의 비정상적인 상황이 생겼을 때 발생
  • 프로그램에서 복구할 수 없는 심각한 장애
  • 보통의 JVM 기타 하드웨어 등의 시스템 문제로 발생
  • Error 발생시 프로그램은 비정상적으로 종료된다.
  • ex) OutOfMemory, StackOverFlow , ThreadDeath 등

Exception

  • 보통 프로그램 실행중 발생
  • 프로그램에서 복구할 수 있는 장애

2. 자바가 제공하는 예외 계층 구조

 

* Error, Exception 모두 Throwable을 상속하고 있다.

 

출처 : https://madplay.github.io/post/java-checked-unchecked-exceptions


 

3. RuntimeException과 RE가 아닌 것의 차이는?

 

* 위의 자바가 제공하는 예외 계층 구조를 참고해서 설명하면 다음과 같다

  Checked Exception Unchecked Exception
구분 RuntimeException를 상속하지 않은 클래스 RuntimException을 상속한 클래스
예외 처리 반드시 예외 처리 명시적으로 예외처리 하지 않아도 된다.
확인 시점 컴파일(Compile) 시점 런타임(Runtime) 시점
트랜잭션 처리 예외 발생시 롤백(rollback)하지 않음 예외 발생시 롤백(rollback)
발생 원인 프로그램 외부 프로그램 내부
설명 프로그램의 제어 밖에서 발생하는 오류 프로그램이 실행될 때 , 내부 코드에서 사용 방법이 잘 못 됐을 때 발생
FileNotFoundException -> 파일(외부)이 존재 하지 않는다 ArithmeticException-> 4/0(0으로 나눌경우) (내부)

 

4. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

 

  설명
try 실행 코드 영역
catch try 에서 Excpetion 발생 시 처리 코드 영역
throw 강제로 예외를 발생 시키는 키워드
throws 메소드에 선언해주면 선언한 메소드를 호출한 메소드에게 예외가 전달된다.
finally try - catch 문에서 예외가 발생하여도 반드시 마지막에 호출되는 영역

 

기본 try - catch

void Exception(){
        try {
            // 입력 코드
        }catch (Exception1 exception1){
            // Exception1 처리 코드
        }catch (Exception2 exception2){
            // Exception2 처리 코드
        }

    }

 

multi catch

  • Java 7 이상 사용 가능
  • 다수의 Exception 하나의 로직으로 처리하기 위해 사용된다.
  • 주의점
    • multi catch로 묶인 Exception 들은 부모-자식 관계에 있으면 안 된다.
    • multi catch 영역에서는 어떠한 Exception인지 알 수 없으므로 Excpetion을 공통 조상 클래스 정보가 담긴다. 
void mulityException(){
        try {
            // 입력 코드
        }catch (ArithmeticException | IllegalArgumentException | IndexOutOfBoundsException exception ){
            // ArithmeticException, IllegalArgumentException, IndexOutOfBoundsException 처리 코드
        }
    }

 

finally

  • finally는 try-catch 과정에서 어떤 예외 상황이 발생해도 반드시 실행되는 영역이다
void finallyException(){
        try {
            // 입력 코드
        }catch (Exception e){
            // Exception 처리 코드
        }finally {
            // 반드시 실행되는 코드 영역
        }
    }

 

try - with - resources

  • Java 7 이상 사용 가능
  • AutoCloseable이라는 Interface를 구현한 클래스에 한해 try에 선언된 클래스의 close()를 자동으로 호출해준다.
    • 필요시에는 AutoCloseable을 구현하여 사용 가능
  • 비교 예
    • compareFinallyResourceExcpetion :  try - catch - finally를 이용한 resources 사용 로직
    • resourceException() : try - with - resources를 이용한 resources 사용 로직

 

사용 전

    void compareFinallyResourceException(){
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

사용 후

    void resourceException(){
        try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));) {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

 

throw

  • 명시적으로 예외를 만들어 낼 때 사용되는 키워드
void throwException(){
        try {
            int a = 4/0;
        }catch (Exception e){
            try {
                throw new Exception("int a = 4/0");
            } catch (Exception exception) {
                exception.printStackTrace();
            }
        }
    }

 

throws

  • Exception에 대한 처리를 호출 메소드에게 위임하기 위해 사용되는 키워드
  • 여러 Exception을 동시에 선언할 수 있다.
void throwsException() throws IllegalArgumentException, FileNotFoundException, ArithmeticException {
        try {
            int a = 4/0;
        }catch (Exception e){
            throw new IllegalArgumentException("int a = 4/0");
        }
    }

 

5. 커스텀한 예외 만드는 방법

 

 

* Exception를 extends 받아 사용한다.

 

  • Checked Exception 을 구현하기 위해서는 Exception 클래스를 상속받는다
  • Unchekced Exception을 구현하기 위해서는 RuntimeException 클래스를 상속받는다.

 

public class customException extends Exception{
}

 

Custom Exception 사용

void customExceoption(){
        try {
            throw new customException();
        } catch (customException e) {
            e.printStackTrace();
        }
    }

❗️ Refer.

 - Exception과 Error의 차이는?
https://github.com/ByungJun25/study/tree/main/java/whiteship-study/9week#try-catch
https://madplay.github.io/post/java-checked-unchecked-exceptions

- 자바가 제공하는 예외 계층 구조
https://madplay.github.io/post/java-checked-unchecked-exceptions

 - 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
https://dololak.tistory.com/61
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

'Live-Study' 카테고리의 다른 글

[11주차] Enum  (0) 2021.02.19
[10주차] 멀티쓰레드 프로그래밍  (0) 2021.02.19
[8주차] 인터페이스  (0) 2021.02.19
[7주차] 패키지  (0) 2021.02.19
[6주차] 상속  (0) 2021.02.19