JavaでのFileNotFoundException

JavaのFileNotFoundException

1. 前書き

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

発生する可能性のあるケース、考えられる処理方法、およびいくつかの例について説明します。

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

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

  • 指定されたパス名doesnotのファイルが存在します

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

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

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

次に、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が発生する可能性がある場合と、それを処理するためのいくつかのオプションについて説明しました。

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