예외를 처리하는 방법 : try-catch문(=직접 처리), 예외 선언하기(=예외 떠넘기기 또는 알리기), 은폐(덮기 / 빈 catch블럭을 추가하는 것)
메서드가 호출시 발생가능한 예외를 호출하는쪽에 알리는 것
- 메서드 + throws + 예외
- 예외를 발생시킬 때는 throw / 메서드에 예외 선언할 때는 throws
- Exception은 모든 예외의 최고 조상이므로 모든 종류의 예외가 발생 가능하다.
- 비록 위의 예외가 3개 밑의 예외가 1개로 적어보이지만, Exception이 모든 예외의 최고 조상이므로 더 많다.
- 본인이 호출한 메서드에 예외를 알려준다.
- Java API문서에서 wait 메서드를 찾은 경우로, Throws를 보면, 2가지 예외가 발생할 수 있음을 말하고 있다.
- 발생할 수 있는 예외가 2개면 throws를 통해 2개 모두 선언해줘야 하는데, 위의 경우 InterruptedException 하나만 선언했다. -> IllegalMonitorStateException이 RuntimeException으로 예외처리가 선택이기 때문이다.
- InterruptedException은 Exception으로 예외처리가 필수적
- main 메서드가 method1을 호출 , method1이 method2를 호출, method2가 Exception을 호출
- method2가 method1에게 예외를 떠넘긴다.
- method1도 main에게 예외를 떠넘기지만, main은 try-catch가 없으므로 비정상종료된다.
- main, method1, method2 중 어느 한 곳이라도 try-catch가 있다면 오류가 발생하지 않는다.
- args[0] = test2.txt
- test2.txt라는 이름으로 파일을 생성
- main에서 createFile 호출 -> 파일명이 null 혹은 ""가 아닐 경우 파일 생성 후 try로 리턴해서 "파일이 성공적으로 생성되었습니다."를 출력
- main에서 createFile 호출 -> 파일명이 null 혹은 ""가 일 경우 "파일이름이 유효하지 않습니다."를 출력하고 catch문으로 가서 "다시 입력해 주시기 바랍니다."를 출력
예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.
- try-catch문 마지막에 finally를 넣는다.
- finally는 예외가 발생하거나 발생하지 않거나 수행되어야 하는 코드를 넣는다.
try { try { startInstall(); startInstall(); copyFiles(); copyFiles(); deleteTempFiles(); // 임시파일 삭제 } catch (Exception e) { } catch (Exception e) { --> e.printStackTrace(); e.printStackTrace(); } finally { deleteTempFiles(); // 임시파일 삭제 deleteTempFiles(); } // try-catch의 끝 } // try-catch의 끝
- 설치하고 파일을 복사한 후, 설치가 완료되면 임시파일 삭제, 설치 중 예외가 발생해도 임시파일 삭제를 해야하는데, 코드가 중복된다.
- 그래서 코드의 중복을 제거하기 위해 finally 블럭이 생겼다.
우리가 직접 예외 클래스를 정의할 수 있다.
조상은 Exception과 RuntimeException중에서 선택class MyException extends Exception { MyException(String msg) { // 문자열을 매개변수로 받는 생성자 super(msg); // 조상인 Exception클래스의 생성자를 호출한다. } }
- Exception = 사용자가 발생시키는 예외
- RuntimeException = 프로그래머의 실수로 발생시키는 예외
- 그런데, Exception은 필수처리 / RuntimeException은 선택처리이므로 가능하면, RuntimeException을 사용
- 조상은 Exception과 RuntimeException중에서 선택해야 한다.
- String 매개변수를 넣어주어야 한다.
예외를 처리한 후에 다시 예외를 발생시키는 것
호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것
- 예외가 발생해서 try-catch처리를 하였는데, 다시 예외를 발생시킨다.
- 밑에서 처리를 하였는데 다시 예외를 발생시켰으므로, 위에서 다시 한번 더 try-catch처리한다.(양쪽 처리)