2010-07-15 24 views
6

NoClassDefFoundError estende LinkageError che a sua volta estende Error.Differenze tra NoClassDefFoundError e ClassNotFoundException?

Javadoc per gli stati di classe di errore:

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

metodi di caricamento delle classi come Class.forName() dichiara solo ClassNotFoundException nella clausola throws. Il che, in aggiunta a sopra descrizione di Error significa che non dovremmo essere di solito cattura le NoClassDefFoundError classi durante il caricamento con Class.forName() ecc

La mia domanda è quali sono le condizioni in cui è NoClassDefFoundError gettati al posto di ClassNotFoundException?

+0

duplicato esatto di http://stackoverflow.com/questions/1457863/quello-è-differenza-tra-noclassdeffounderr-and-classnotfoundexception – skaffman

+0

Ho anche trovato una discussione correlata qui: http://stackoverflow.com/ domande/430089/in-java-can-class-forname-ever-return-null/430092 # 430092 –

risposta

12

ClassNotFoundException è più probabile che essere gettato (per il codice) in situazioni in cui si desidera caricare manualmente le classi - proprio per le cose come Class.forName(). Questi nomi possono venire dall'input dell'utente, per esempio.

NoClassDefFoundError si verificherà quando un file di classe si riferisce a una classe che quindi non può essere trovata. La classe era presente a un certo momento, ma ora non lo è - questo non è solo un bug nel codice che sta tentando di fare una riflessione, è un errore di implementazione di non rendere disponibili tutte le classi richieste. Per quanto posso dire una NoClassDefFoundError volontà di solito o forse sempre involucro un ClassNotFoundException - ma il punto è che questo non è qualcosa il codice ha lo scopo di evitare, in quanto indica un ambiente che è probabilmente troppo rotto per recuperare da.

Almeno, questa è la mia comprensione :)

+2

@Downvoter: Ti va di spiegarti perché? –

+1

C'è un'altra domanda molto più votata per questo, con le risposte più votate, ma ho sentito che questa risposta lo spiegava meglio e forniva informazioni carenti agli altri. (Ad esempio l'osservazione che NoClassDefFoundError sembra sempre avvolgere ClassNotFoundException, che chiarisce molto sull'intenzione di queste due classi.) – skiphoppy

+0

@Jon Puoi dare un esempio pratico di quando i nomi delle classi provengono dall'input dell'utente? – Geek

0

NoClassDefFoundError occures in fase di esecuzione, perché il compilatore in grado di trovare il file .class.