Ich habe die folgende Methode in Klasse A. Alle Klassen A, B, C und die Hauptklasse, von der 'A' aufgerufen wird, befinden sich in demselben Glas.Wie löst man java.lang.NoClassDefFoundError im selben Jar?
public class A {
private static void init() {
if (!init) {
synchronized (B.class) {
if (!init) {
map = C.creat();
init = true;
}
}
}
}
}
Der Code wirft eine Throwable
, java.lang.NoClassDefFoundError
am synchronized
Block (Linie No.4). Was kann der Grund sein, da alle Klassen im gleichen Jar sind, gibt es keine Möglichkeit während der Laufzeit keine Klasse zu finden.
Ich habe die Lösung in Existing Question durchgegangen, konnte aber keine Lösung finden. Bitte helfen Sie.
Es gibt statische Initialisierungsblöcke und statische Variablen in der Klasse B.
Das Problem behoben werden kann, wenn ich eine static object/class A
verwenden Sie das Stück Code zu synchronisieren anstelle von ‚B‘. Ich bin neugierig zu wissen, warum ich die Ausnahme behandelt habe und wie man es nur mit Klasse B beheben kann.
Warum verwenden Sie B.class zum Synchronisieren? Ich denke nicht, dass dies eine Best Practice ist. – duffymo
Könnte es sein, dass die statischen Blöcke in B die 'A.init' Methode aufrufen? – RealSkeptic
Können Sie die Paketstruktur des Glases zeigen?Du kannst jd-gui dekompilieren – Optimus