2014-12-03 3 views
2

이점/단점이 있습니까?스캐너가 예외를 throw하는 대신 스캐너 # ioException()을 사용하는 이유는 무엇입니까?

try { 
    inputStream.read(); 
}catch(IOException e) { 
    e.printStackTrace(); 
} 

을하지만 Scanner를 사용하는 경우, 당신은 예외를 처리하도록 강요되지 않습니다 스트림에서 읽을 때

일반적으로, 당신은 예외를 던질 것입니다. 대신 던지면 Scanner#ioException()을 사용합니다.

나는 Scanner이 스트림이 아니라 필요한 경우 데이터를 구문 분석하는 토크 나이저가 아니라 IO와 관련된 다른 동작과 달리 예외를 처리하는 이유를 알고 있습니까? 이런 방식으로 언제 예외를 처리해야합니까?

답변

5

설명은 class documentation for java.util.Scanner입니다.

스캐너는 읽기 가능 인터페이스를 구현하는 모든 개체에서 텍스트를 읽을 수 있습니다. 기본이되는 읽을 수있는 Readable.read (java.nio.CharBuffer) 메소드의 호출이 IOException를 Throw하면, 스캐너는 입력의 마지막에 이른 것으로 간주합니다. 기본이되는 read에 의해 throw 된 가장 최근의 IOException는, ioException() 메소드를 사용해 취득 할 수 있습니다.

Scanner은 하위 수준 I/O 판독기의 상위 수준 소비자이며 예외 자체를 처리합니다. ioException() method을 원할 경우 을 예외로 사용할 수 있습니다.. 특정 생성자 외에는 호출자가 I/O 관련 예외를 잡을 필요없이 스캐너 API의 동작이 잘 정의되어 있습니다.

호출자가 try/catch 블록을 작성하거나 자신의 메서드를 IOException 유형으로 설정하지 않아도된다는 이점이 있습니다. 이는 스캐너 구현이 이미 exceptions as flow control이 필요없는 방식으로 이러한 엣지 케이스를 처리하고 있기 때문에 가능합니다.

스캐너 메서드가 확인 예외를 throw하는 경우 예외적 인 경우로부터 적절한 복구 방법을 사용하는 경우 호출자는 catch 블록 만 작성해야합니다. 실제로 을 쓸 것입니다. 클래스가 인 경우 클래스가 구현 세부 사항만으로 인해 확인 된 예외를 throw하는 메소드를 선언함으로써 "오염 됨"이됩니다 (이유는입니다. 은 스캐너 클래스을 사용합니다.

한편, 하위 레벨 Readable 인터페이스와 그 구현은 예외적 인 경우를 처리 할 방법이없고 을 호출자에게 던져야합니다. 그들은 "올바른"회복 수단이 무엇인지, 또는 어떤 적절한 수단이 존재하는지 알 수있는 방법이 없습니다. 확인 된 예외를 throw하는 것은 필요할 수 있지만 가능한 경우 API를 사용하면 예외를 피하려고합니다.

관련 문제