Quando eseguo questo codice le uscite app con un ClassNotFoundException:Se un NoClassDefFoundError è causato da una classe ClassNotFoundException, perché Java si aspetta che sia possibile catturare entrambi i materiali da gettare?
//uncaught ClassNotFoundException
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (NoClassDefFoundError e)
{
}
Quando tento di compilare questo codice, il compilatore si lamenta che il ClassNotFoundException non è raggiungibile perché non si butta all'interno del try-clausola la dichiarazione try-catch.
//Won't compile
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (ClassNotFoundException e)
{
}
Quando ho eseguito questo codice, l'unica throwable che viene catturato è un NoClassDefFoundError.
//catches throwable of type java.lang.NoClassDefFoundError,
//with a java.lang.ClassNotFoundException as its cause
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
}
catch (Throwable e)
{
System.out.println(e.getClass().getName());
System.out.println(e.getCause().getClass().getName());
}
Il seguente codice compilare e intercettare l'errore (e solo l'errore), ma è goffo:
//possible workaround
try
{
Class<?> clazz = defineClass(null, bytes, 0, bytes.length, null);
table.put(clazz.getName(), clazz);
if (1 == 0) throw new ClassNotFoundException(); // we want the code to compile
}
catch (ClassNotFoundException e)
{
System.out.println("ex");
}
catch (NoClassDefFoundError e)
{
System.out.println("err");
}
Eppure quando scrivo quanto segue, posso ottenere via senza una clausola catch per la causa dell'errore:
//and yet this works just fine...
try
{
throw new Error(new IOException());
}
catch (Error e)
{
System.out.println("err");
}
Esempio 3 mi porterebbe a concludere che il throwable era un NoClassDefFoundError. L'esempio 1 mi porterebbe a concludere che il throwable era una ClassNotFoundException. Eppure, l'Esempio 2 mostra che java non mi lascerà nemmeno scrivere codice per catturare correttamente ClassNotFoundException.
Proprio quando stavo per concludere che il problema qui è l'errore-causato-da-un'eccezione, ho eseguito il codice mostrato nell'esempio precedente che mostra che quella non è la regola.
Qualcuno può spiegare cosa sta succedendo qui?
PS: questa è la traccia stack:
java.lang.NoClassDefFoundError: com/my/pckage/MyClass
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at Main$MyClassLoader.getClasses(Main.java:78)
at Main.main(Main.java:109)
Caused by: java.lang.ClassNotFoundException: com.my.pckage.MyClass
at java.lang.ClassLoader.findClass(ClassLoader.java:522)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 4 more
Qualcosa non si aggiunge. Presumibilmente, stai scrivendo un caricatore di classi personalizzato, includi eventuali metodi sovrascritti che potresti aver definito per esso. – Perception
'defineClass' non genera ClassNotFoundException. Se ricevi questa eccezione, viene da qualche altra parte. –
@ j-smith È meglio se si può dare una sscce per mostrare il problema. Ci sono alcune possibilità per l'eccezione ineguagliata. Ad esempio, l'eccezione "finale" che causa l'uscita dell'app può essere generata da un livello esterno, per il quale cattura il tuo NoClassDefFoundError e rethrow con ClassNotFoundException. È meglio se puoi controllare la "causa" dell'eccezione e lo stack di chiamate nell'eccezione. Ti dà un'idea su dove l'eccezione è effettivamente originata. –