public static void main(String[] args) {
File file = new File("./test.txt");
try (FileInputStream fileInputStream = new FileInputStream(file);){
byte[] bytes = new byte[512];
fileInputStream.read(bytes, 0, 512);
fileInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2. 더 자세한 예외를 사용하자
메소드를 정의할 때 발생할 수 있는 예외를 명시하게 되어있다. 메소드에서 발생할 수 있는 예외는 최대한 자세한 예외를 명시하는 것이 좋다.
public void exceptableMethod() throws Exception;
public void exceptableMethod() throws NumberFormatException;
가장 간단한 방법은 Exception 클래스로 다 던져버리는 것이다. 하지만 이렇게 되면 이 메소드를 사용하는 쪽에서 Exception을 받아 처리하는 코드가 복잡해진다.
하지만 Exception으로 명시한 경우 발생한 예외가 매우 다양하기 때문에 모든 경우에 대해서 처리를 해주어야 한다.
따라서 더 상세한 예외를 사용하도록 하자.
3. 발생할 수 있는 예외를 기술하라
메소드가 예외를 발생시킬 수 있는 경우, 어떤 경우에 어떤 예외가 발생할 수 있는지 javadoc을 통해 명시해야 한다.
최대한 자세한 예외를 사용하더라도 어떤 경우에 예외가 발생할 수 있는지 자세히 글로 설명해줘야 메소드를 호출하는 쪽에서 적절한 대응이 가능하다.
/**
* 이 메소드는 ~일때 사용하는 메소드입니다.
*
* @param input 입력 값
* @throws MyCustomException ~일때 ~한 경우에 이 예외가 발생합니다.
*/
public void method1(String input) throws MyCustomException;
4. 메시지를 자세하게 적는다.
사용자 정의 예외를 만들 때, 예외가 발생한 상황에 대해 메시지를 적을 수 있다.
이 때, 어떤 상황에서 예외가 발생했는지 1~2문장 정도로 간결하게 잘 적어야 한다. 이 메시지 또한 너무 길면 좋지 않다. 예외의 이름에서 어떤 상황인지 알 수 있을 때에는 너무 많은 정보를 메시지에 적지 않아도 된다.
예를들어 IOException 같은 경우는 왜 실패했는지 부가적인 정보가 필요하지만 NumberFormatException 예외의 경우는 숫자 포맷이 아닌 값을 변환하려고 했구나 라고 추측이 가능하다.