2011-08-18 5 views
52

Questa è probabilmente una domanda per principianti, ma spero che tu possa aiutarmi. :) Ho qualcosa di simile:Utilizzo di e.printStackTrace() in Java

try 
{ 
//try to do something there 
} 
catch (IOException e) 
{ 
//handle the exception 
e.printStackTrace(); 
} 

Sto usando NetBeans IDE e per qualche motivo il printStackTrace è evidenziata una linea ondulata. Quando premo Alt + Invio, viene indicato che Throwable.printStackTrace() deve essere rimosso. Cosa significa questo? Qualcuno potrebbe dare più informazioni su come ciò potrebbe significare? Oppure posso ignorarlo?

Grazie!

risposta

20

È solo una raccomandazione. In Eclipse va bene - credo che sia solo l'IDE a dirti che esistono metodi più convenzionali per farlo, come alcune delle altre risposte. Trovo che sia utile per il debug e che dovresti dire agli utenti quando si verificherà un errore fatale, utilizzare una modalità di debug (come un commutatore di console -d) per raccogliere questi log.

+0

utilizzando un framework di registrazione come log4j è uno di questi metodi migliori. – svarog

36

Prova:

e.printStackTrace(System.out); 
+0

Ah, grazie @Pablo! Pazzo, perché questo fa sparire l'avviso esattamente? Se non si specifica 'System.out' come parametro e lo si lascia vuoto, la JVM assume il suo comando 'debug-mode e invia solo alla console? –

+6

Hack! Questo in realtà non risolve il problema tanto quanto impedisce a Netbeans di mostrarlo. Questo verrà comunque inviato al flusso di errori predefinito. – ThePerson

+0

@ThePerson 'System.err' stamperà sul flusso di errore predefinito, non' System.out'. 'System.out' rappresenta il flusso di output predefinito. – cst1992

14

Probabilmente è perché printStackTrace() in realtà non gestire l'errore tanto quanto basta discariche lo stack nella console. Funziona come un segnaposto fino a quando non lo sostituisci con una corretta gestione degli errori (se necessario) e sostituisce l'output con un logger di qualche tipo.

9

e.printStackTrace();

Non è una buona pratica, perché stampa in ErrorStream di default, che il più delle volte è la console!

NetBeans dovrebbe avvisarti. La buona pratica a riguardo, sta registrando il messaggio. Seguire stesso riferimento:

http://onjava.com/pub/a/onjava/2003/11/19/exceptions.html

EDIT Vedi primo commento sotto per maggiori informazioni.

+6

No, stampa sul default Errorstream, che è un flusso separato, alias FileDescriptor, e può essere reindirizzato a un file separato: 'java YourClass 1> file.out 2> file.err' - stampa e.printStackTrace a ' file.err ', non' file.out '. –

+2

Non sempre è una buona pratica. Questa console potrebbe essere una console in un server Web a cui non è possibile accedere. A volte è meglio che questa traccia dello stack venga scaricata anche nel registro corrente dell'applicazione, specialmente nelle applicazioni web. –

1

La semplice stampa di una traccia di stack non è sufficiente. La stampa della traccia dello stack dell'eccezione di per sé non significa che sia completamente una cattiva pratica, ma stampare solo la traccia dello stack quando si verifica un'eccezione è un problema.

log sempre delle eccezioni (utilizzando un buon logging framework), ma non li espongono al l'utente finale. E assicurati di mostrare le tracce dello stack solo in modalità di sviluppo.

Io stesso uso (il più delle volte) logger.log(Level.SEVERE, <exception>.getMessage(), <exception>);.

quando NetBeans si suggeriscono per gestire l'eccezione 'Surround Statement with try-catch', se si fa clic su questo, genererà):

try { 
    //something need to be handle(exception that throw) 
} catch (SQLException ex) { 
    Logger.getLogger(ClassName.class.getName()).log(Level.SEVERE, null, ex); 
} 

che è meglio di ex.printStackTrace();.

Questi possono aiutare:

0
e.printStackTrace(System.err); 

ha lavorato per me