보통사람

[Study-9주차] 예외 처리 본문

Study

[Study-9주차] 예외 처리

pej4303 2021. 1. 12. 20:13
  • 목표

    • 자바의 예외 처리에 대해 학습하세요.

  • 학습할 것 (필수)

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

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

    • Exception과 Error의 차이는?

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

    • 커스텀한 예외 만드는 방법

 

0. 오류

  • 정의 : 프로그램이 오작동하거나 비정상적으로 종료되는 것을 의미

  • 종류

    • 컴파일 에러 : 컴파일 시 발생하는 에러 

    • 런타임 에러 : 런타임(실행)시 발생하는 에러

    • 논리적 에러 : 프로그램이 실행은 되나 의도와 다르게 동작하는 것

 

1. Exception과 Error

 

  • 공통점 : 런타임시 발생함

  • 차이점

    • Exception : 소스코드로 예방할 수 있음

    • Error : 소스코드로도 예방 할 수 없음

 

2. 자바가 제공하는 예외의 계층 구조(RuntimeException과 RE가 아닌 것)

 

출처 - https://www.nextree.co.kr/p3239/

  • RuntimeException 클래스들

    • RuntimeException 클래스와 그 하위 클래스들을 의미

    • 개발자의 실수로 발생하는 예외

    • 예외 처리를 필수로 안 해도 됨(Uncheked Exception)

    • 런타임(실행) 시 확인함

    • 예) IndexOutOfBoundsException, NullPointException 등등

  • Exception 클래스들

    • RuntimeException 클래스들의 제외한 나머지 클래스를 의미

    • 사용자의 실수로 발생하는 예외

    • 예외 처리를 필수로 해야 됨(Cheked Exception)

    • 컴파일 시 확인함

    • 예) FileNotFoundException, ClassNotFoundException 등등

 

3자바에서 예외 처리 방법

 

3.1. 예외 복구(try-catch-finally)

try {
    // 예외가 발생할 수 있는 부분
} catch (Exception e) {
    // 예외 발생시 처리 내용
} finally {
    // 예외 발생 여부와 상관없이 항상 수행되어야 하는 내용
}

try-catch문 흐름

  • 예외에 대한 적절한 처리를 하는 것을 의미함
  • 예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어짐

  • catch

    • catch문을 차례대로 내려가면서 instanceof 연산자를 이용하여 발생한 예외와 일치하는 블록인지 확인하며 일치하는 것이 없을 경우 그 예외는 처리되지 못함

    • 멀티 catch 블록

      • Java 1.7부터 여러개의 예외를 하나의 catch 블록에서 사용 할 수 있음

      • 상속 관계에 있는 예외를 같이 사용 할 수 없음

상속 관계인 Exception인 경우 컴파일 에러 발생함

// 일반 try-catch문 이용
try {
    throw new NullPointerException();
} catch (NullPointerException e) {
    System.out.println("## NullPointerException ##");
} catch (IndexOutOfBoundsException e) {
    System.out.println("## IndexOutOfBoundsException ##");
}


// 멀티 catch문 이용
try {
    throw new NullPointerException();
} catch (NullPointerException | IndexOutOfBoundsException e) {
    // 이렇게 Exception마다 개별 처리 할 수도 있음
    if ( e instanceof NullPointerException ) {
        System.out.println("## NullPointerException ##");
    } else if (e instanceof IndexOutOfBoundsException) {
        System.out.println("## IndexOutOfBoundsException ##");
    }
}
  • finally

    • try 블록이나  catch 블록에서 return문을 수행해도 finally 블록의 내용이 먼저 수행된 다음 return 됨

package com.study.halle.s1.week09;

public class TestException {
    public static void main(String args[]) {
        test();
        System.out.println("return해서 다시 main()으로 돌아옴");
    }
    
    public static void test() {
        try {
            System.out.println("## try ##");
            return;
        } catch (Exception e) {
            System.out.println("## catch ##");
        } finally {
            System.out.println("## finally ##");
        }
    }
}

[실행결과]
## try ##
## finally ##
return해서 다시 main()으로 돌아옴

 

  • try-with-resources문

    • Java 1.7부터 추가된 try-catch문의 변형으로 입출력 클래스들을 사용할 때 유용함

    • try 블록에 자원의 객체를 생성하여 넣으면 try블록을 벗어나는 순간 자동적으로 자원을 종료시켜줌
    • AutoCloseable 인터페이스의 구현체만 자동적으로 자원을 종료시켜줄 수 있음
// 기존 try-catch-finally문 이용
FileInputStream fis = null;

try {
    fis = new FileInputStream("");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 
    try {
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

// try-with-resources문 이용
try (FileInputStream fis = new FileInputStream("")) {
    
} catch (IOException e){
    e.printStackTrace();
}

 

3.2. 예외 처리 회피

  • 예외를 처리하지 않고 메소드 선언부에 throws 키워드를 이용해서 예외를 선언함(예외 전달)

  • 해당 메소드를 사용하고자 하고자 할때 어떤 예외를 처리해야 되는지 쉽게 알 수 있음

  • 선언한 예외뿐만 아니라 그 자식타입의 예외까지도 발생 할 수 있음 

메소드 선언부 throws 예외1, 예외2 {
    
}


public static void test() throws Exception {
    // Exception의 모든 자식 타입의 예외가 발생 할 수 있음
}

 

3.3. 예외 전환

  • 정확한 예외로 전환 후 throw 키워드로 예외 전달함

throw 예외


throw new Exception();

 

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

  • 새로운 예외 클래스를 만들어서 사용 할 수 있으나 가능하면 기존의 예외 클래스를 활용하는 것 좋음
package com.study.halle.s1.week09;

public class MyException extends Exception {
    
    private static final long serialVersionUID = 1L;

    MyException(String msg) {
        super(msg);
    }
}


public class TestException {
    
    public static void main(String args[]) {
        try {
            myException();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
    
    static void myException() throws MyException {
        throw new MyException("사용자 정의 에러 발생함");
    }
}

 

※ 참조

 

Java의 정석

www.nextree.co.kr/p3239/

reference-m1.tistory.com/246

'Study' 카테고리의 다른 글

[Study-12주차] 어노테이션(Annotation)  (0) 2021.01.31
[Study-11주차] Enum  (0) 2021.01.26
[Study-8주차] 인터페이스  (0) 2021.01.04
[Study-7주차] 패키지  (0) 2020.12.29
[Study-6주차] 상속  (0) 2020.12.22