2014-02-27 6 views
8

Einige Benutzer meiner Anwendung habe diese Ausnahmejava.lang.NoClassDefFoundError: [generic] bei dalvik.system.NativeStart.main (native Methode)

java.lang.NoClassDefFoundError: [generic] 
at dalvik.system.NativeStart.main(Native Method) 

Es ist nicht üblich Ausnahme wegen der großen Anzahl von Benutzern und nur einige von ihnen haben diese Ausnahme. Ich benutze keine native Bibliothek und alle Äußerlichkeiten Bibliotheken verwenden Sie keine nativen Code

Version von Android, wo es passiert:

  1. 4.0.3 - 4.0.4 (97,7%)
  2. Android 4.0 - 4.0.2 (1,5%)
  3. Android 4.1 (0,8%)

Kann mir jemand mit Workaround helfen? Kann der Empfänger in AndroidManifest dieses Problem nennen?

+3

Dies ist keine nützliche Information überhaupt. Bitte geben Sie detaillierte 'log' oder' stackTrace' an. –

+0

Stellen Sie uns FULL StackTrace zur Verfügung. Es gibt eine Menge wichtiger Informationen in Zeilen, die Sie vor uns verstecken. –

+0

Vielleicht laufen sie mit einer niedrigeren JRE-Version? – robermann

Antwort

7

NoClassDefFoundError mit dem [generic] Tag wird von der VM aus einem "vorgefertigten" Objekt geworfen. Die Ausnahme hat keinen nützlichen Stack-Trace, erscheint aber im Allgemeinen nicht von selbst.

Hintergrund: Der Mechanismus zum Laden von Klassen erfordert das Auslösen von Ausnahmen, wenn eine Klasse in einem Loader nicht gefunden werden kann. Ladeprogramme müssen auf ihren übergeordneten Loader verschoben werden. Wenn Sie also versuchen, eine Anwendungsklasse zu laden, wird zuerst der Bootstrap-Loader gefragt, der fehlschlägt und eine Ausnahme auslöst. Der App-Loader führt dann seine eigene Suche durch, die wahrscheinlich erfolgreich sein wird.

Das bedeutet, dass die VM eine Exception zuweist, das Objekt initialisiert und den Stack-Trace ausfüllt ... und dann wegwirft, für jede Klasse, die nicht aus dem Bootstrap-Klassenlader kommt.

Um sinnlose Zuordnungen zu vermeiden, löst der Bootstrap-Loader (der in der VM implementiert ist) ein generisches, zuvor zugewiesenes Ausnahmeobjekt aus. Da das Objekt beim Start der VM vollständig gebildet ist, enthält es keine sinnvollen Stack-Trace-Informationen.

In der Praxis sehen Sie diese nicht, da Anwendungen in der Regel Klassen nicht direkt vom Bootstrap-Loader laden. Die Anwendung oder der Systemlader erstellt für Sie eine sinnvolle Ausnahme. Selbst wenn Sie eine Klasse direkt vom Bootstrap Loader anfordern, sollten Sie dies nur als "Ursache" eines ClassNotFoundException sehen.

Die DexClassLoader wurde geschrieben, um einen Fehlercode anstelle einer Ausnahme zu verwenden, wenn eine Klasse nicht gefunden werden kann, so dass Sie dies über diesen Pfad überhaupt nicht sehen werden.

Wenn die NoClassDefFoundError die "Ursache" einer größeren Ausnahme ist, müssen Sie die äußerste Ausnahme abrufen, da dies die sinnvolle Stapelverfolgung haben wird. Wenn Sie sehen, dass diese selbst erscheinen, dann passiert etwas sehr Seltsames - höchstwahrscheinlich versucht ein bisschen Code, Klassen direkt zu laden und übergibt null anstelle eines Klassenladeobjekts (auf diese Weise verweisen Sie auf den Bootstraploader). .

+0

) Ich habe die gleiche Ausnahme beim Debuggen meiner App durchlaufen.Das nervte mich lange, weil ich keine Datei des Quellcodes geändert habe. Das Problem war, dass ich eine Funktion von Android Studio aktiviert habe, die (wie ein Haltepunkt) bei jeder ausgelösten Ausnahme bricht. Und wegen dem, was Sie hier beschrieben haben, bricht die IDE jedes Mal in dieser verdammten Ausnahme. – wm1sr

Verwandte Themen