-
메서드에 예외 선언 (throws로 예외 던지기)JAVA/예외처리 2023. 7. 28. 14:21
void method() throws ExceptionA, ExceptionB, ... ExceptionZ { }
위와 같이 메서드에 throws로 예외를 던질 수 있다.
(예외를 발생시키는 키워드 throw와 예외를 메서드에 선언하는 throws는 다르다.)
이렇게 예외를 선언하면, 이 예외뿐만 아니라 자손타입의 예외까지 함께 발생시킬 수 있으니 오버라이딩할 때에는 선언된 예외의 개수 뿐 아니라 상속관계를 잘 고려해야만 한다.
자바에서 메서드를 작성할 때 메서드 내에서 발생할 가능성이 있는 예외를 메서드의 선언부에 명시하여 이 메서드를 사용하는 쪽에서 이에 대한 처리를 하도록 강요하기 때문에, 프로그래머들의 짐을 덜어주는 것은 물론이고 견고한 프로그램 코드를 작성할 수 있도록 도움을 준다.
public class Main { public static void main(String[] args) throws Exception{ method1(); } static void method1() throws Exception { method2(); } static void method2() throws Exception { throw new Exception(); } }
이 코드를 실행시키면 예외가 발생해서 비정상적으로 코드가 종료된다. 그 이유는 method2 -> method1 -> main메서드 순으로 예외를 던져주는데 main메서드에서 조차 예외 처리를 해주지 않았기 때문에 프로그램이 정상적으로 종료가 되지 않은 것이다.
public class Main { public static void main(String[] args) { method1(); } static void method1() { try { throw new Exception(); } catch (Exception e) { System.out.println("method1에서 예외 처리"); e.printStackTrace(); } } }
public class Main { public static void main(String[] args) { try { method1(); } catch (Exception e) { System.out.println("main 메서드에서 예외 처리"); } } static void method1() throws Exception { throw new Exception(); } }
위의 두 코드는 모두 main 메서드가 method1()을 호출하며 method1()에서 예외가 발생한다.
하지만 위의 상황에서는 method1()에서 예외를 처리했기 때문에 method1()을 호출한 main 메서드는 예외가 발생한 사실조차 모른다.
아래의 상황에서는 method1()은 throws Exception으로 예외를 던졌고 그걸 main 메서드가 try-catch로 처리했기 때문에 main메서드의 method1()을 호출한 라인에서 예외가 발생한 것으로 간주되어서 이에 대한 처리를 한 것이다.
예외가 method1()에서 발생했지만 예외 처리는 method1()를 호출한 메서드에서 할 수도 있다. 예외처리를 분담할 때 어떻게 설계 하는지에 따라 상황이 달라질 수도 있다는 것이다.
public class Main { public static void main(String[] args) { try { File f = createFile(args[0]); System.out.println(f.getName() + "파일 생성 완료."); } catch (Exception e) { System.out.println(e.getMessage() + "파일 이름 다시 입력해주세요."); } } static File createFile(String fileName) throws Exception { if (fileName==null || fileName.equals("")) throw new Exception("파일 이름이 유효하지 않습니다."); File f = new File(fileName); f.createNewFile(); return f; } }
위의 코드와 같이 createFile이란 메서드에서 파일 이름이 제대로 들어오지 않았을 때 예외를 만들고 싶으면 throw로 예외를 만들고 메서드 선언부에 throws로 예외를 던진다음 메인 메서드에서 처리해주면 된다.
'JAVA > 예외처리' 카테고리의 다른 글
예외처리 (try - catch문)와 예외 발생시키기 (0) 2023.07.28