..

Search

66) 예외 발생 및 회피

66) 예외 발생 및 회피

예외 발생 및 회피


예외 발생시키기

자바에서는 throw 키워드를 사용하여 강제로 예외를 발생시킬 수 있습니다.

예제

Exception= new Exception("오류메시지");

...

throw e;

 

위의 예제처럼 생성자에 전달된 문자열은 getMessage() 메소드를 사용하여 오류 메시지로 출력할 수 있습니다.


예외 회피하기

메소드 선언부에 throws 키워드를 사용하여 해당 메소드를 사용할 때 발생할 수 있는 예외를 미리 명시할 수도 있습니다.

이렇게 하면 해당 메소드를 사용할 때 발생할 수 있는 예외를 사용자가 충분히 인지할 수 있으며, 그에 대한 처리까지도 강제할 수 있습니다.

따라서 더욱 안정성 있는 프로그램을 손쉽게 작성할 수 있도록 도와줄 수 있습니다.

 

다음 예제는 호출된 메소드에서 발생한 예외를 호출된 메소드에서 처리하는 예제입니다.

예제

public class Exception03 {

    static void handlingException() {

        try {

            throw new Exception();

        } catch (Exception e) {

            System.out.println("호출된 메소드에서 예외가 처리됨!");

        }

    }

 

    public static void main(String[] args) {

        try {

            handlingException();

        } catch (Exception e) {

            System.out.println("main() 메소드에서 예외가 처리됨!");

        }

    }

}

코딩연습 ▶

실행 결과

호출된 메소드에서 예외가 처리됨!

 

이때 호출된 메소드의 try / catch 문을 생략하면 컴파일 오류가 발생합니다.

또한, 이 메소드를 호출한 main() 메소드는 호출된 메소드에서 예외가 발생한 사실을 알 수 없습니다.

 

다음 예제는 throws 키워드를 사용하여 호출된 메소드에서 발생한 예외를 호출한 메소드로 넘기는 예제입니다.

예제

public class Exception04 {

    static void handlingException() throws Exception { throw new Exception(); }

 

    public static void main(String[] args) {

        try {

            handlingException();

        } catch (Exception e) {

            System.out.println("main() 메소드에서 예외가 처리됨!");

        }

    }

}

코딩연습 ▶

실행 결과

main() 메소드에서 예외가 처리됨!

 

이렇게 함으로써 호출된 메소드에는 try / catch 문을 생략할 수 있습니다.

그리고 호출된 메소드에서 발생한 예외를 해당 메소드를 호출한 main() 메소드에서 처리할 수 있게 됩니다.


사용자 정의 예외 클래스

자바에서는 Exception 클래스를 상속받아 자신만의 새로운 예외 클래스를 정의하여 사용할 수 있습니다.

사용자 정의 예외 클래스에는 생성자뿐만 아니라 필드 및 메소드도 원하는 만큼 추가할 수 있습니다.

예제

class MyException extends RuntimeException {

    MyException(String errMsg) {

        super(errMsg);

    }

}

 

요즘에는 위와 같이 Exception 클래스가 아닌 예외 처리를 강제하지 않는 RuntimeException 클래스를 상속받아 작성하는 경우가 많습니다.


try-with-resources 문

Java SE 7부터는 사용한 자원을 자동으로 해제해 주는 try-with-resources 문을 사용할 수 있습니다.

문법

try (파일을열거나자원을할당하는명령문) {

     ...

}

 

위와 같이 try 블록에 괄호(())를 추가하여 파일을 열거나 자원을 할당하는 명령문을 명시하면, 해당 try 블록이 끝나자마자 자동으로 파일을 닫거나 할당된 자원을 해제해 줍니다.

 

다음 예제는 파일에서 문자열을 한 줄 읽어오는 예제입니다.

예제

static String readFile(String filePath) throws IOException {

    BufferedReader br = new BufferedReader(new FileReader(filePath));

    try {

        return br.readLine();

    } finally {

        if (br != null)

            br.close();

    }

}

 

위의 예제에서 사용된 BufferedReader에 대한 더 자세한 사항은 자바 스트림 수업에서 확인할 수 있습니다.

자바 스트림 수업 확인 =>

 

위와 같이 Java SE 7 이전에서는 finally 블록을 사용하여 사용한 파일을 닫아줘야 했습니다.

하지만 try-with-resources 문을 사용하면 다음과 같이 자동으로 파일의 닫기를 수행할 수 있습니다.

예제

static String readFile(String filePath) throws IOException {

    try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {

        return br.readLine();

    }

}


연습문제