1. 序章

この記事では、Javaの非常に一般的な例外であるFileNotFoundExceptionについて説明します。

それが発生する可能性のあるケース、それを処理するための可能な方法、およびいくつかの例について説明します。

2. 例外はいつスローされますか?

JavaのAPIドキュメントに示されているように、この例外は次の場合にスローされる可能性があります。

  • 指定されたパス名存在しないのファイルが存在します
  • 指定されたパス名のファイルは存在しますは何らかの理由でアクセスできません(読み取り専用ファイルの書き込みを要求されたか、アクセス許可がアクセスを許可していませんファイル)

3. それをどのように扱うか?

まず、 java.io.IOException を拡張し、 java.lang.Exception を拡張することを考慮すると、try-catchを処理する必要があります。 は、他のチェックされたE xceptionと同様にブロックします。

次に、 try-catch ブロック内で何をするか(ビジネス/ロジック関連)は、実際には何をする必要があるかによって異なります。

次のことが必要になる場合があります。

  • ビジネス固有の例外を発生させる:これは実行の停止エラーである可能性がありますが、アプリケーションの上位層に決定を残します(元の例外を含めることを忘れないでください)
  • ダイアログまたはエラーメッセージでユーザーに警告します。これは実行停止エラーではないため、通知するだけで十分です。
  • ファイルの作成:オプションの構成ファイルを読み取り、それを見つけず、デフォルト値で新しいファイルを作成します
  • 別のパスにファイルを作成します。何かを書き込む必要があり、最初のパスが使用できない場合は、フェイルセーフパスを試してください。
  • エラーをログに記録するだけです。このエラーは実行を停止するべきではありませんが、将来の分析のためにログに記録します。

4. 例

ここで、いくつかの例を示します。これらはすべて、次のテストクラスに基づいています。

public class FileNotFoundExceptionTest {

    private static final Logger LOG
      = Logger.getLogger(FileNotFoundExceptionTest.class);
    private String fileName = Double.toString(Math.random());
    
    protected void readFailingFile() throws IOException {
        BufferedReader rd = new BufferedReader(new FileReader(new File(fileName)));
        rd.readLine();
        // no need to close file
    }

    class BusinessException extends RuntimeException {
        public BusinessException(String string, FileNotFoundException ex) {
            super(string, ex);
        }
    }
}

4.1. 例外のログ

次のコードを実行すると、コンソールにエラーが「ログ」に記録されます。

@Test
public void logError() throws IOException {
    try {
        readFailingFile();
    } catch (FileNotFoundException ex) {
        LOG.error("Optional file " + fileName + " was not found.", ex);
    }
}

4.2. ビジネス固有の例外を発生させる

次に、ビジネス固有の例外を発生させて、エラーを上位層で処理できるようにする例を次に示します。

@Test(expected = BusinessException.class)
public void raiseBusinessSpecificException() throws IOException {
    try {
        readFailingFile();
    } catch (FileNotFoundException ex) {
        throw new BusinessException(
          "BusinessException: necessary file was not present.", ex);
    }
}

4.3. ファイルの作成

最後に、ファイルを読み取れるように作成しようとしますが(おそらく、ファイルを継続的に読み取っているスレッドの場合)、例外をキャッチして、発生する可能性のある2番目のエラーを処理します。

@Test
public void createFile() throws IOException {
    try {
        readFailingFile();
    } catch (FileNotFoundException ex) {
        try {
            new File(fileName).createNewFile();
            readFailingFile();            
        } catch (IOException ioe) {
            throw new RuntimeException(
              "BusinessException: even creation is not possible.", ioe);
        }
    }
}

5. 結論

この簡単な記事では、 FileNotFoundException が発生する可能性がある場合と、それを処理するためのいくつかのオプションについて説明しました。

いつものように、完全な例はGithub以上です。