2011-12-08 13 views
11

Per la mia applicazione Java, sto creando un'istanza di un oggetto informazioni utente e lo popolo con un servizio per il quale non controllo l'origine.Java - ignora l'eccezione e continua

Il codice simile a questo:

// username given as parameter 
UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (Exception e) { 
    // Whatever 
} 

Se LDAPService.findUser() non può individuare un utente, si getterà un NullPointerException e macinare il resto della mia applicazione ad un arresto. Va bene se le informazioni dell'utente non sono popolate, quindi voglio essere in grado di continuare senza che tutto il resto inizi a generare eccezioni.

C'è un modo per farlo?

+6

Ignorare le eccezioni è una cattiva pratica! – mre

+5

Il tuo codice non lo fa? Finché '// Whatever' non fa nulla, l'esecuzione continuerà normalmente dopo il blocco try/catch. –

+0

qual è il problema? Se 'findUser' genera un'eccezione, viene catturato nel' catch' che hai già scritto. Non si fermerà anythign? – Nanne

risposta

18

Ho svalutato Amir Afghani's answer, che sembra essere l'unico ancora in grado di rispondere alla domanda.

Ma avrei scritto in questo modo invece:

UserInfo ui = new UserInfo(); 

DirectoryUser du = null; 
try { 
    du = LDAPService.findUser(username); 
} catch (NullPointerException npe) { 
    // It's fine if findUser throws a NPE 
} 
if (du != null) { 
    ui.setUserInfo(du.getUserInfo()); 
} 

Naturalmente, dipende se si desidera o meno per catturare NPE dai ui.setUserInfo() e du.getUserInfo() chiamate.

+1

contrassegnerò il tuo come risposta. Sembra che tutto ciò di cui avevo bisogno fosse un blocco try/catch più stretto. – SpeedBurner

+1

Ho votato la tua risposta perché a) hai ragione, e b) mi hai esplicitamente chiamato fuori. –

+0

Vorrei aggiungere dato che non vogliamo necessariamente catturare e ignorare TUTTE le NullPointerExceptions, si potrebbero esaminare ulteriormente i dettagli dell'NPE (getCause, getMessage, getLocalizedMessage, getStackTrace) e se non corrisponde a criteri molto specifici e ristretti , rilanciarlo. Ma poi, ho appena notato che il mio commento è di circa 7 anni dopo il fatto. – mtwagner

0

È possibile scrivere un blocco try-catch attorno alla linea che si desidera ignorare.

Come nell'esempio del tuo codice. Se continui semplicemente il tuo codice sotto la parentesi di chiusura del blocco catch va tutto bene.

3

Lo state già facendo nel vostro codice. Esegui questo esempio qui sotto. Il fermo "gestirà" l'eccezione e potrai andare avanti, assumendo che qualsiasi cosa tu abbia catturato e gestito non abbia infranto il codice lungo la strada che non avevi previsto.

try{ 
     throw new Exception(); 
}catch (Exception ex){ 
    ex.printStackTrace(); 
} 
System.out.println("Made it!"); 

Tuttavia, è necessario gestire sempre correttamente un'eccezione. Puoi entrare in situazioni piuttosto disordinate e scrivere codice difficile da mantenere "ignorando" le eccezioni. Dovresti farlo solo se stai effettivamente gestendo ciò che è andato storto con l'eccezione al punto che in realtà non influenza il resto del programma.

0

LDAPService deve contenere un metodo come LDAPService.isExists(String userName) utilizzarlo per impedire il lancio di NPE. Se non lo è, potrebbe essere una soluzione alternativa, ma utilizza la registrazione per pubblicare un avviso ..

+0

Il problema principale è che non riesco a modificare la classe LDAPService. – SpeedBurner

+0

Se c'è un modo per sapere che l'utente non è presente in LDAP è quello di ottenere NPE - è giusto ignorarlo, ma tra l'altro dovresti loggarlo sul livello INFO/DEBUG –

2

Generalmente è considerata una cattiva idea ignorare le eccezioni. Di solito, se è appropriato, si desidera notificare l'utente del problema (se si preoccupa) o per lo meno, registrare l'eccezione o stampare la traccia dello stack sulla console.

Tuttavia, se ciò non è veramente necessario (sei tu che prendi la decisione) allora no, non c'è altro modo di ignorare un'eccezione che ti costringe a prenderlo. L'unica revisione, in questo caso, che suggerirei è elencare esplicitamente la classe delle eccezioni che stai ignorando, e alcuni commenti su perché stai ignorandoli, invece di ignorare semplicemente qualsiasi eccezione, come hai fatto nel tuo esempio.

18

È possibile prendere lo NullPointerException esplicitamente e ignorarlo, anche se generalmente non è raccomandato. Si dovrebbe non, tuttavia, ignorare tutte le eccezioni come si sta facendo attualmente.

UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (NullPointerException npe) { 
    // Lulz @ your NPE 
    Logger.log("No user info for " +username+ ", will find some way to cope"); 
} 
1

Si sta effettivamente ignorando l'eccezione nel codice. Ma ti suggerisco di riconsiderare.

Ecco una citazione da Coding Crimes: Ignoring Exceptions

Tanto per cominciare, l'eccezione deve essere registrato per lo meno, non appena scritto verso la console.Inoltre, nella maggior parte dei casi, l'eccezione deve essere restituita al chiamante perché possano gestirli. Se il telefono non deve essere restituito al chiamante, è necessario gestire l'eccezione . E alcuni commenti sarebbero anche belli.

La scusa di consueto per questo tipo di codice è "Non ho avuto il tempo", ma c'è un effetto a catena quando il codice viene lasciato in questo stato. Le probabilità sono che la maggior parte di questo tipo di codice non uscirà mai nella produzione finale . Le revisioni del codice o gli strumenti di analisi statica dovrebbero catturare questo modello di errore . Ma questa non è una scusa, tutto ciò non fa altro che aggiungere tempo alla manutenzione e al debug del software .

Anche se lo si ignora, suggerisco di utilizzare nomi di eccezioni specifici anziché il nome della superclasse. es., utilizzare NullPointerException anziché Exception nella clausola catch.

0

La stampa della traccia STACK, la registrazione o l'invio di un messaggio all'utente sono modi molto negativi di elaborare le eccezioni. Qualcuno può descrivere soluzioni per risolvere l'eccezione nei passaggi appropriati, quindi può provare nuovamente l'istruzione rotta?

Problemi correlati