4

例外を試行/キャッチするか、if ステートメントを使用してさまざまな結果を処理する方がよいでしょうか?

便宜上ファイルをコピーし、ifs を使用してファイルが存在しないイベントを処理し、各メソッドのスローを宣言する短いプログラムを Java で作成していますが、try/catch は使用しません。

これらの if と関連するセクションを try/catch に置き換えるべきですか、それともユーザーの小さなコミュニティと共有するための「許容できる」プログラミングですか?

4

3 に答える 3

5

欠落しているということは、ファイルが常にそこにある必要があることを意味する場合、それは例外です。

ファイルの欠落が通常の (可能性がある、または可能性が高い) ことを意味する場合は、例外を使用しないでください。

于 2011-05-21T02:52:22.187 に答える
3

入力を関数に渡す前に、入力の有効性をチェックする (そして不正な入力に対処する) ことは、通常は良い設計です。これにより、通常、コードが読みやすく、きれいになります。

ただし、実際には、コピーを試行する前にどれだけのチェックが行われたかに関係なく、この場合はおそらく不適切な入力を処理する必要があります。これは、ファイルが事前に存在することを確認したとしても、後で削除される可能性があるためです。別の IO エラーが発生する可能性があります。

于 2011-05-21T02:53:33.940 に答える
2

欠落しているファイルを処理する唯一の本当に安全な方法は、例外を処理することです。このことを考慮:

if (file.exists() && file.canRead()) {
    try {
        is = new FileInputStream(file);
    } catch (IOException ex) {
        // Never happens
    }
}

実際、「決して起こらない」ケースが発生する可能性があります。例えば:

  • fileが実際にディレクトリである場合、オープンは失敗します。( を呼び出すことで対処できますがfile.isDirectory()、対処が難しい場合もあります...フレーキーなリムーバブルメディアにファイルを作成するなど)。

  • このアプリケーションがファイルをテストしてから開こうとするまでの間に、外部アプリケーションがファイルを削除したり、小さなウィンドウでそのアクセス許可を変更したりしたとします。この競合状態に対処する方法はまったくありません...

さらに、これらの各テストは、おそらくシステム コールです。システムコールは高価です - 例外の作成/スロー/キャッチとほぼ同じくらい高価です。

したがって、ファイルを開くときに IO 例外が発生する可能性に対処する最善の方法は、それらが発生するのを待つことです。必ずFileAPI を使用して問題を診断してください。ただし、IO 例外を回避するために API に依存しないでください。

于 2011-05-21T06:38:23.573 に答える