2011-11-16 19 views
10

ho fatto un programma che prende il file Elf (* ae * .o.) E dare la lista dei metodi di nome, ma se qualcuno rinomina qualsiasi file in * .ao * .o allora mostrerà:Come catturare java.lang.NoClassDefFoundError?

Exception occurred during event dispatching: 
java.lang.NoClassDefFoundError: org/eclipse/core/resources/IWorkspaceRunnable 
    at org.eclipse.cdt.utils.AR.<init>(AR.java:237) 
    at com.lge.windowELF.ElfBinaryArchive.<init>(ElfBinaryArchive.java:24) 
    at com.lge.windowELF.ELFParserLibraryFile.createBinaryArchive(ELFParserLibraryFile.java:230) 
    at com.lge.windowELF.ELFParserLibraryFile.<init>(ELFParserLibraryFile.java:46) 
    at com.lge.windowELF.ELFWrapper.<init>(ELFWrapper.java:36) 
    at com.lge.windowELF.ELF_UIIntegrated.actionPerformed(ELF_UIIntegrated.java:510) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 

In questa situazione voglio dare un messaggio di avvertimento. Questa eccezione non viene catturata da try/catch.

+0

Cercare il file JAR che dovrebbe contenere la classe o l'interfaccia 'IWorkspaceRunnable'. È presente nel tuo classpath? –

+0

possibile duplicato di [Quando catturare java.lang.Error?] (Http://stackoverflow.com/questions/352780/when-to-catch-java-lang-error) – adatapost

+0

può essere catturato catturando questo errore specifico o 'Throwable'. ma potrebbe essere che dovresti gestire la condizione del file mancante nel tuo codice in modo più elegante ... – aishwarya

risposta

4

È non consigliato per intercettare uno Error! Stati JavaDoc:

Un Error è una sottoclasse di Throwable che indica gravi problemi che un ragionevole applicazione non dovrebbe cercare di recuperare.

Il mio suggerimento è di risolvere il problema con lo NoClassDefFoundError e di preoccuparsi delle eccezioni generate dal codice.

avrei preferito, nel codice, lanciare un InvalidELFFileException (un'ipotesi) sul ElfBinaryArchive costruttore di classe (o avvolgere la classe e fare un throws quando si crea un'istanza) quando la classe tenta di aprire il file ELF. In questo modo, se c'è un file ELF non valido, viene generata un'eccezione decente.

In alternativa, assicurarsi che org.eclipse.core.resources.IWorkspaceRunnable sia inserito in CLASSPATH.

+15

Downvote perché __should not__ non è uguale a __must not__ o __never__, non dovrebbe significare che sia permesso, solo non raccomandato. E se qualcuno chiede "Come faccio qualcosa?", In genere non è utile dire "Basta non farlo"; Lo considererei anche maleducato, anche se la tua risposta potrebbe essere stata utile. – Mecki

+5

Non ho mai saputo di fare downvoting basato sull'uso della lingua inglese. Pensavo che SO fosse basato su soluzioni correlate alla programmazione. Se questo fosse basato sulla lingua inglese, allora questo post non dovrebbe essere più vantaggioso su StackExchange in inglese? (Vedi [esempio] (http://english.stackexchange.com/questions/56065/must-not-or-may-not-which-is-the-most-correct)). –

+1

Un utente ti chiede come fare qualcosa e tu gli dici che non lo farà, è per questo che hai downvoted. Non devi farlo è __no rispondere alla domanda__. – Mecki

43

NoClassDefFoundError è una sottoclasse di Error e non uno Exception. Quindi è necessario utilizzare:

try { 
    new org.eclipse.cdt.utils.AR(); 
} 
catch(NoClassDefFoundError e) { 
    //handle carefully 
} 

nel codice. Si noti che non si dovrebbe mai catturare Error o Throwable. Assicurati inoltre di circondare il meno codice possibile con questo catch in quanto questa eccezione non dovrebbe in genere essere rilevata.

AGGIORNAMENTO: Sei sicuro di voler rilevare questa eccezione? È molto raro e non riesco a immaginare come lo vuoi gestire. Forse dovresti semplicemente aggiungere un JAR con la classe IWorkspaceRunnable al tuo CLASSPATH?

+2

Questa risposta è molto migliore, dovrebbe essere accettata in quanto effettivamente risponde alla domanda e allo stesso tempo aiuta a risolvere il vero problema. – Mecki

+1

Potrebbe essere una situazione in cui potresti volerlo prendere. Quando si ridistribuisce l'applicazione in un contenitore di app Web. Poi c'è una sessione che distrugge il listener e lì cerca di trovare una classe che non si trova più nel classpath perché è stata annullata. – ACV

+0

ecco una situazione: ho il jar richiesto nel mio classpath ma sto distribuendo il codice alle persone che non possono e vogliono assicurarsi di sapere come aggiungerlo quando provano ad eseguirlo. – Luke

Problemi correlati