13

FileNotFoundException viene generato in tutte le occasioni, non necessariamente solo quando il nome del file non è valido, ma anche quando e. g. permessi non permettono un file da creare o leggere:Rileva la causa sottostante per 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) 

L'esempio sopra mostra un Windows tedesca lamentano nome utente o password non valida.

C'è un modo per evitare l'analisi del messaggio di eccezione per ottenere informazioni più dettagliate su perché esattamente l'errore si è verificato? Il problema con l'analisi del messaggio è che in diverse località i messaggi possono variare.

risposta

10

Esegui il controllo delle autorizzazioni di esistenza/lettura-scrittura prima di creare FileOutputStream.

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

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

Si noti che a volte si dovrà controllare i permessi di lettura/scrittura su un genitore di file di destinazione che, se è necessario creare un nuovo file.

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! A volte la vita può essere talmente semplice. Grazie per aver aperto gli occhi all'ovvio. –

+1

Fai attenzione. Ci sono apparentemente alcuni bug che possono influenzare il risultato di ritorno di questi metodi. È possibile ottenere risultati non validi se la directory è una directory personalizzata o di sistema o se si trova su determinati tipi di condivisione di rete. –

+0

A quanto pare sono appena diventato un po 'http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4939819 che ti dirà che la directory home dell'utente (documenti e impostazioni ...) su Windows non è scrivibile. Soluzione alternativa: provare a creare un file temporaneo nella cartella principale ed eliminarlo subito dopo, in caso di esito positivo. Se viene generata una IOException, non puoi davvero scrivere. –

1

Un approccio consiste nell'esaminare il tipo effettivo dell'eccezione: come si può vedere dallo docs, ci sono molte sottoclassi che forniscono informazioni più dettagliate.

Tuttavia, probabilmente non andrai molto lontano. Come con la maggior parte delle eccezioni controllate, solitamente è meglio registrare/segnalare l'eccezione e chiedere all'utente le scelte su come correggerlo.

+0

Problema: ottengo un oggetto FileNotFoundException, non un IOException generico. Vorrei presentare un messaggio utente migliore di "File non trovato" o "Errore generico", che indica all'utente il problema dell'autorizzazione ... –

+0

Errore mio - Ho letto IOException. Sfortunatamente, le eccezioni Java raramente hanno informazioni aggiuntive (come un codice di errore POSIX), e in molti casi sono estese per coprire condizioni che hanno poca relazione con il loro nome (a volte a causa dell'assegnazione del codice POSIX al tipo di eccezione, a volte, penso, a causa della pigrizia). – kdgregory

2

Si consiglia di esaminare le proprietà del file utilizzando l'oggetto java.io.File prima di tentare di leggere il file. Esiste un metodo canRead su cui è possibile utilizzare per determinare se l'utente può leggere o meno il file.