web-dev-qa-db-ja.com

理解Java IOException

IOExceptionを理解するために助けが必要です。私はインターネットで多くの情報を検討し、OracleのJava Webサイトで技術仕様を調べました。

IOExceptionクラスとそのすべてのサブクラスの理解において、関連する「エラーメッセージ」または「戻りコード」の値がないことは正しいですか?

したがって、メッセージや戻りコードの値を発行したい場合は、IOExceptionキャッチロジックを使用してそれらを挿入する必要がありますか?

上記が当てはまる場合、さまざまなIOExceptionサブクラスをどのように分離しますか?

例えばアプリケーションがIOExceptionを検出した場合、それはどのようなIOExceptionですか? End-Of-File、File-Is-Closed、File-Not_found、File-In-Useなど.

16
Guy Rich

例外(通常)には「戻りコード」値はありませんが、エラーメッセージが含まれています。また、それらをcatchブロックで処理する必要があります。ここで、処理する例外のタイプを指定できます。 catchブロックの後にいくつかのtryブロックを置くと、異なるタイプの例外を異なる方法で処理できます。 catchブロックは指定された順序で呼び出され、適切なパラメータタイプを持つ最初のブロックが例外を処理します。したがって、最初に特定の例外タイプをキャッチし、次に一般的な例外タイプをキャッチする必要があります。

単純な例:

try {
  ...
  throw new FileNotFoundException("This is an error message");
  ...
} catch (FileNotFoundException e) {
  System.out.println("File not found: " + e.getMessage());
  ...
} catch (EOFException e) {
  System.out.println("End of file reached: " + e.getMessage());
  ...
} catch (IOException e) { // catch all IOExceptions not handled by previous catch blocks
  System.out.println("General I/O exception: " + e.getMessage());
  e.printStackTrace();
  ...
} 

最後のcatchブロックで確認できるように、例外には、それらのOriginのスタックトレースが保存され、印刷できます。ただし、通常、このようなメッセージをここのように直接印刷することはお勧めできません。実際の製品コードでは、通常、ログフレームワークを使用してこれらのメッセージをログに記録するか、UIにメッセージ(の適切な部分)を表示します。

21
Péter Török

エラーコードはありませんが、非常に頻繁にメッセージが表示されます。たとえば、問題の原因を特定するのに役立つファイル名やその他の詳細を含めることができます。

取得できる例外の詳細については、 IOException のサブクラスを参照してください。

それらを処理するには、さまざまなcatch句を使用できます。 より具体的な例外に移動することを忘れないでください(最初のブロックでIOExceptionをキャッチすると、FileNotFoundExceptionなどのより具体的なブロックは機能しません)。場合によっては、単一のcatch (IOException)ですべてをキャッチしたいことがあります。サブクラスを別の方法で処理する必要がない場合。

try {
    // ...
} catch (FileNotFoundException e) {
    // ...
} catch (IOException e) {
    // ...
}
4
Konrad Garus

(catch allブロックではなく)特定の方法で処理する例外について検討する必要があります。候補を見つけたら、継承ツリーに従ってそれらをキャッチする必要があります。最初はより具体的で、より一般的です(サブクラスからスーパークラスまで)。ブラックリストに含まれる例外が多すぎて、キャッチする必要のある例外が1つだけの場合は、そのブロックを小さな部分に分割することを検討してください。

2
Radu Stoenescu

Instanceofを使用して、例外またはオブジェクトがどのクラスかを判別できます。ただし、例外の場合は、catchブロックを使用します。

} catch(FileNotFoundException e) {
  // file not found handling

} catch(EOFException e) {
  // handle reaching the End-Of_File.

} catch(IOException e) {
  // generic IOException handling for any other IOException.

}
1
Peter Lawrey

IOExceptionサブクラスを異なる方法で処理するには、次のように、それらを個別にキャッチする必要があります。

try {
  // some code that may throw an exception
}
catch (EOFException e) {
  // handle an end-of-file exception here)
}
...
catch (IOException e) {
  // handle an IOException that's not covered in previous catch statements
}
catch (Exception e) {
  // handle any other kind of exception
}
1
Anthony Grist