2009-11-02 11 views
13

Wyjątek FileNotFoundException jest zgłaszany przy różnych okazjach - niekoniecznie tylko wtedy, gdy nazwa pliku jest nieprawidłowa, ale także gdy e. sol. uprawnienia nie zezwalają na utworzenie lub odczytanie pliku:Wykryj podstawową przyczynę dla 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) 

Powyższy przykład przedstawia niemiecki system Windows narzekający na nieprawidłową nazwę użytkownika lub hasło.

Czy istnieje sposób na zanalizowanie komunikatu o wyjątkach, aby uzyskać nieco dokładniejsze informacje na temat , dlaczego dokładnie wystąpił wyjątek w postaci? Problem z parsowaniem wiadomości polega na tym, że w różnych lokalizacjach wiadomości będą się różnić.

Odpowiedz

10

Wykonaj sprawdzenie uprawnień do istnienia pliku/odczytu i zapisu przed utworzeniem FileOutputStream.

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

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

Zauważ, że czasami trzeba będzie sprawdzić uprawnienia do odczytu/zapisu na rodzica z was pliku docelowego, jeśli chcesz utworzyć nowy plik.

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! Czasami życie może być takie proste. Dziękuję za otwarcie oczu na to, co oczywiste. –

+1

Uważaj. Są najwyraźniej niektóre błędy, które mogą wpłynąć na wynik zwrotu z tych metod. Możesz uzyskać nieprawidłowe wyniki, jeśli twój katalog jest katalogiem niestandardowym lub systemowym lub jest w określonych typach udziałów sieciowych. –

+0

Wygląda na to, że zostałem pobity przez http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4939819, który powie ci, że katalog domowy użytkownika (dokumenty i ustawienia ...) w systemie Windows nie jest zapisywalny. Obejście: Spróbuj utworzyć plik tymczasowy w folderze nadrzędnym i usuń go natychmiast po pomyślnym zakończeniu. Jeśli zostanie zgłoszony wyjątek IOException, naprawdę nie można pisać. –

1

Jednym podejściem jest przyjrzeć się faktycznemu typowi wyjątku: jak można zauważyć z docs, istnieje wiele podklas, które dostarczają drobniejszych informacji.

Jednak prawdopodobnie nie będzie to daleko. Podobnie jak w przypadku większości sprawdzonych wyjątków, zwykle lepiej jest rejestrować/zgłaszać wyjątek i pytać użytkownika o wybór sposobu jego poprawienia.

+0

Problem polega na tym, że otrzymuję wyjątek FileNotFoundException, a nie ogólny wyjątek IOException. Chciałbym przedstawić lepszą wiadomość użytkownika niż "Nie znaleziono pliku" lub "Błąd ogólny", wskazując użytkownikowi na problem z uprawnieniami ... –

+0

Mój błąd - przeczytałem wyjątek IOException. Niestety, wyjątki Java rzadko zawierają dodatkowe informacje (takie jak kod błędu POSIX), aw wielu przypadkach są rozciągane, aby objąć warunki, które mają niewielki związek z ich nazwą (czasami z powodu przypisania kodu POSIX do typu wyjątku, czasami, jak sądzę, z powodu lenistwa). – kdgregory

2

Przed próbą odczytania pliku możesz zajrzeć do właściwości pliku przy użyciu obiektu java.io.File. Istnieje metoda canRead, za pomocą której można określić, czy użytkownik może odczytać plik.

Powiązane problemy