ITEM 74
메서드가 던지는 예외는 그메서드를 올바로 사용하는데 아주 중요한 정보이다.
따라서
잘못된 예
public void examMethod() throws Exception {
//TODO 무언가 하겟죠?
}
모든 예외를 Exception 으로 던지게 된다면 메서드 사용자는 각 예외에 대처할 수 있는 방법이 없다.
(다른 예외까지 삼켜버릴 수 있기 때문에 API 활용성이 크게 떨어진다.)
단 ! Main 메서드는 예외이다.(main 메서드는 오직 JVM 만이 호출 함으로)
올바른 예
/**
* @throws SQLException SQL 이 잘못된 경우
* @throws ClassNotFoundException 지정한 경로에 클래스파일이 존재하지 않는경우.
*/
public void examMethod() throws SQLException,ClassNotFoundException{
Class.forName("/test/path/test.class");
// TODO 무언가 했음.
}
자바 언어가 요구하는 것은 아니지만 비검사 예외도 검사 에외처럼 정성껏 문서화해두면 좋다.
단 메서드가 던질수 있는 예외를 각각 @throws 태그로 문서화하되 , 비검사 예외는 메서드 선언의 thorws 목록에 넣지말자.
**잘못된 예(비검사 예외를 thorws 목록에 포함시킴) **
/**
* @throws SQLException SQL 이 잘못된 경우
* @throws ClassNotFoundException 지정한 경로에 클래스파일이 존재하지 않는경우.
* @throws NullPointerException 지정한 요소에 null 이 들어오는 경우
*/
public void examMethod() throws SQLException,ClassNotFoundException,NullPointerException{
Class.forName("asd");
// TODO 무언가 했음.
}
올바른 예
/**
* @throws SQLException SQL 이 잘못된 경우
* @throws ClassNotFoundException 지정한 경로에 클래스파일이 존재하지 않는경우.
* @throws NullPointerException 지정한 요소에 null 이 들어오는 경우
*/
public void examMethod() throws SQLException,ClassNotFoundException{
Class.forName("asd");
// TODO 무언가 했음.
}
검사냐 비검사냐에 따라 API 사용자가 해야 할 일이 달라지므로 이 둘을 확실히 구분하자.
한 클래스에 정의된 많은 메서드가 같은 이유로 같은 예외를 던진다면 그 예외를 각각의 메서드가 아닌 클래스 설명에 추가하는 방법이 있다.
예
public class Exam {
/**
* @throws SQLException SQL 이 잘못된 경우
* @throws ClassNotFoundException 지정한 경로에 클래스파일이 존재하지 않는경우.
* @throws NullPointerException 지정한 요소에 null 이 들어오는 경우
*/
public void examMethod() throws SQLException,ClassNotFoundException{
Class.forName("asd");
// TODO 무언가 했음.
}
/**
* @throws NullPointerException 지정한 요소에 null 이 들어오는 경우
*/
public void examMethod2() throws IOException{
//TODO 일하는 중
}
}
다음과 같이 여러 메서드에서 같은이유로 NullPointerException 을 던지는 경우 다음과 같이 클래스 설명에 추가하자 !
클래스 설명에 추가
/**
* <p> {@code NullPointerException} 지정한 요소에 null 이 들어오는 경우 발생합니다.</p>
*/
public class Exam {
/**
* @throws SQLException SQL 이 잘못된 경우
* @throws ClassNotFoundException 지정한 경로에 클래스파일이 존재하지 않는경우.
*/
public void examMethod() throws SQLException,ClassNotFoundException{
Class.forName("asd");
// TODO 무언가 했음.
}
public void examMethod2() throws IOException{
//TODO 일하는 중
}
}
- 메서드가 던질 가능성이 있는 모든 예외를 문서화 하라
- 문서화에는 자바독 @throws 태그를 사용하면된다.
- 검사 예외만 메서드 선언의 throws 문에 일일이 선언하고 , 비검사 예외는 메서드 선언에는 기입하지말자.
- 발생가능한 예외를 문서로 남기지 않으면 다른 사람이 그 클래스나 인터페이스를 효과적으로 사용하기 어렵다.