2009-11-02 45 views
13

FileNotFoundExceptionは、あらゆる種類の場合にスローされます。ファイル名が無効な場合だけでなく、e。 g。ファイルを作成または読み取ることが許可されていません。java.io.FileNotFoundExceptionの根本原因を検出します。

java.io.FileNotFoundException: \\server\share\directory\test.csv (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131) 
    at java.io.FileWriter.<init>(FileWriter.java:73) 

上記の例では、無効なユーザー名またはパスワードについてドイツ語のWindowsが表示されています。

に少し細かい情報を得るために例外メッセージを解析する方法がありません。なぜ、ちょうど例外が発生しましたか?メッセージ解析の問題は、異なるロケールでメッセージが異なることです。

答えて

10

FileOutputStreamを作成する前に、ファイルの存在/読み取り/書き込みのアクセス権を自分で確認してください。

File test_csv = new File("\\server\share\directory\test.csv"); 

if (test_csv.exists() && test_csv.canWrite()) 
{ 
    // Create file writer 
    ... 
} 
else 
{ 
    // notify user 
    ... 
} 

新しいファイルを作成する必要がある場合は、宛先ファイルの親に対して読み取り/書き込みのアクセス許可をチェックする必要があることがあります。

File test_csv = new File("\\server\share\directory\test.csv"); 
File parent_dir = test_csv.getParentFile() 

if (parent_dir.exists() && parent_dir.canWrite()) 
{ 
    // Create file writer 
    ... 
} 
else 
{ 
    // notify user 
    ... 
} 
+0

D'Oh!時には人生は簡単にすることができます。明らかに私の目を開いてくれてありがとう。 –

+1

注意してください。明らかに、これらのメソッドの戻り値に影響を与えるバグがいくつかあります。ディレクトリがカスタムディレクトリまたはシステムディレクトリの場合、または特定の種類のネットワーク共有にある場合は、無効な結果が得られる可能性があります。 –

+0

どうやら私はちょうどhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4939819によってちょっと覚悟しています。これはWindows上のユーザのホームディレクトリ(ドキュメントと設定...)が書き込み可能でないことを伝えます。回避策:親フォルダに一時ファイルを作成し、成功した場合は直後に削除してください。 IOExceptionがスローされた場合、実際には書き込むことはできません。 –

1

docsからわかるように、より詳細な情報を提供する多くのサブクラスがあります。例外の実際のタイプを調べる方法があります。

しかし、あなたはおそらくそれで遠くにはなりません。チェックされたほとんどの例外と同様に、通常は例外を記録/報告し、ユーザにその例外の修正方法の選択肢を尋ねる方がよいでしょう。

+0

問題は、一般的なIOExceptionではなく、FileNotFoundExceptionが発生します。私は "File Not Found"や "Generic Error"よりも優れたユーザメッセージを提示して、ユーザに権限の問題を指摘したいと思います... –

+0

私の間違い - 私はIOExceptionを読んでいます。残念なことに、Javaの例外では、POSIXエラーコードなどの追加情報はめったにありません。多くの場合、名前とほとんど関係のない条件をカバーするように拡張されています(POSIXコードの例外タイプへの割り当て、怠惰のために)。 – kdgregory

2

ファイルを読み取ろうとする前に、java.io.Fileオブジェクトを使用してファイルのプロパティを調べるとよいでしょう。ユーザーがファイルを読み取ることができるかどうかを判断するために使用できるcanReadメソッドがあります。

関連する問題