ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 예외 처리 - 리소스 닫기 & 예외 넘기기(Throw)
    CSE/Java 2016. 4. 21. 10:55

    예외처리는 여러 절로 구성되어 있습니다.



    예외와 예외 클래스 & 실행 예외

    예외 처리 코드 

    자동 리소스 닫기 & 예외 넘기기(Throw)

    사용자 정의 예외




    자동 리소스 닫기

     자바 7부터 추가된 try-with-resources 를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체(각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널)의 close() 메소드를 호출해서 안전하게 닫아줍니다. 


     다음은 이전 자바 6에서 사용했던 리소스 객체 닫기 코드입니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    FileInputStream fis = null;
     
    try {
     
        fis = new FileInputStream("file.txt");
        ...
     
    catch (IOException e) {
     
        ...
     
    finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {}
        }
    }
     
    cs



     finally 블록에서 다시 try-catch 블록으로 fis를 닫아줘야합니다. 다소 복잡한 면이 있습니다. 


     다음으로는 자바7에서 닫는 방법을 예제로 보겠습니다.



     * FileInputStream.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package except;
     
    public class FileInputStream implements AutoCloseable {
        private String file;
        
        public FileInputStream(String file) {
            this.file = file;
        }
        
        public void read() {
            System.out.println(file + "을 읽습니다.");
        }
        
        public void close() throws Exception {
            System.out.println(file + "을 닫습니다.");
        }
    }
     
     
     
    cs



     * TryWithResExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package except;
     
     
    public class TryWithResExam {
     
        public static void main(String[] args) {
            try (FileInputStream fis = new FileInputStream("text.txt")) {
                fis.read();
                throw new Exception();    // 강제적으로 예외 발생
            } catch (Exception e) {
                System.out.println("예외 처리 코드 실행");
            }
        }
     
    }
     
     
     
    cs






     위처럼 수행하기 위해서 java.lang.AutoCloseable 인터페이스를 구현한 객체여야 합니다. 





    예외 떠넘기기

     메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만, 경우에 따라서는 메서드를 호출한 곳으로 예외를 떠넘길 수 있습니다.


     이때 사용하는 키워드는 throws 입니다. throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 합니다. throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 됩니다.


    1
    2
    3
    4
    리턴타입 메소드명(파라미터,...) throws exceptionClass1, exceptionClass2, ... {
     
    }
     
    cs



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



     * ThrowsExam.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package except;
     
     
    public class ThrowsExam {
     
        public static void main(String[] args) {
            try {
                findClass();
            } catch (ClassNotFoundException e) {
                System.out.println("클래스가 존재하지 않습니다");
            }
        }
        
        public static void findClass() throws ClassNotFoundException {
            Class clasis = Class.forName("what.the.Heck");
        }
     
    }
     
     
     
    cs





    end




     * 신용권의 '이것은 자바다'를 참조한 포스팅입니다.

    댓글

Designed by Tistory.