JavaでのFileNotFoundException
1前書き
この記事では、Javaで非常に一般的な例外、
FileNotFoundException
について説明します。
発生する可能性がある場合、その可能性のある対処方法、およびいくつかの例を取り上げます。
2. 例外が発生するのはいつですか?
JavaのAPIドキュメントに示されているように、この例外は次の場合にスローされる可能性があります。
-
指定されたパス名を持つファイルは
存在しません
存在しません** -
指定されたパス名を持つファイルは
存在
しますが、
は
何らかの理由でアクセスできない**
3取り扱い方法は?
まず最初に、それが
java.lang.Exception
を拡張する
java.io.IOException
を拡張することを考慮して、他のチェックされたE
__xception
のようにそれを
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
が発生する可能性がある場合と、それを処理するためのいくつかのオプションについて説明しました。
いつものように、完全な例はhttps://github.com/eugenp/tutorials/tree/master/core-java-io[Githubの上に]です。