34 Stimmen

Android ClassNotFoundException

Ich habe ein Problem mit einer meiner Apps und frage mich, ob mir jemand einen Einblick geben könnte, was es verursachen könnte.

Ich erhalte eine ClassNotFoundException, die wichtige Zeile lautet

E/AndroidRuntime(21982): Verursacht durch: java.lang.ClassNotFoundException: couk.doridori.goigo.customUI.GoBoardView in Loader dalvik.system.PathClassLoader@446fc3d0

Diese App ist seit über einem Jahr draußen und vor 2 Tagen haben mich zwei verschiedene Benutzer bezüglich dieses Problems kontaktiert, einer mit einem HTC Wildfire (2.1) und einer mit einem Samsung Galaxy S (?). Ich kann dieses Problem auf meinen Geräten (2.2 und 1.6) oder einem Emulator (2.1) nicht reproduzieren und kann nicht wirklich herausfinden, warum diese Klasse nicht vom Klassenlader gefunden werden kann. Ich habe eine Weile gegoogelt, aber ohne Erfolg, und hoffe, dass jemand Hinweise hat! Es tritt anscheinend nur auf, wenn eine Aktivität geladen wird, bei der beim Setzen des ContentView versucht wird, eine benutzerdefinierte Ansicht namens GoBoardView aufzublasen, die die View-Klasse erweitert. Diese führt nur einfache Canvas-Zeichnungen durch und verwendet keine Drittanbieter-Bibliotheken oder andere Klassen, die einen Paketnamenkonflikt oder ähnliches verursachen könnten.

Bitte helfen Sie! Falls es sich um ein Build-Problem handelt, aktualisiere ich mein SDK und ADT durch Eclipse, da es gegen 1.6 erstellt wurde und das alte ADT verwendet wurde, aber ich habe keine Ahnung, ob dies helfen wird, dachte aber, es wäre einen Versuch wert. Jegliche Ratschläge wären super, danke! (siehe unten für BEARBEITEN)

E/AndroidRuntime(21982): java.lang.RuntimeException: Aktivität ComponentInfo{couk.doridori.goigoFull/couk.doridori.goigoFull.Board} starten: android.view.InflateException: Binary-XML-Datei Zeile #14: Fehler beim Aufblasen der Klasse couk.doridori.goigo.customUI.GoBoardView
E/AndroidRuntime(21982): bei android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
E/AndroidRuntime(21982): bei android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
E/AndroidRuntime(21982): bei android.app.ActivityThread.access$2200(ActivityThread.java:126)
E/AndroidRuntime(21982): bei android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
E/AndroidRuntime(21982): bei android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(21982): bei android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(21982): bei android.app.ActivityThread.main(ActivityThread.java:4603)
E/AndroidRuntime(21982): bei java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(21982): bei java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(21982): bei com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(21982): bei com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(21982): bei dalvik.system.NativeStart.main(Methode: 0)
E/AndroidRuntime(21982): Verursacht durch: android.view.InflateException: Binary-XML-Datei Zeile #14: Fehler beim Aufblasen der Klasse couk.doridori.goigo.customUI.GoBoardView
E/AndroidRuntime(21982): bei android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime(21982): bei com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
E/AndroidRuntime(21982): bei android.app.Activity.setContentView(Activity.java:1629)
E/AndroidRuntime(21982): bei couk.doridori.goigoFull.Board.onCreate(Board.java:31)
E/AndroidRuntime(21982): bei android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(21982): bei android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
E/AndroidRuntime(21982): ... 11 weitere
E/AndroidRuntime(21982): Verursacht durch: java.lang.ClassNotFoundException: couk.doridori.goigo.customUI.GoBoardView in Loader dalvik.system.PathClassLoader@446fc3d0
E/AndroidRuntime(21982): bei dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
E/AndroidRuntime(21982): bei java.lang.ClassLoader.loadClass(ClassLoader.java:573)
E/AndroidRuntime(21982): bei java.lang.ClassLoader.loadClass(ClassLoader.java:532)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.createView(LayoutInflater.java:466)
E/AndroidRuntime(21982): bei android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
E/AndroidRuntime(21982): ... 22 mehr

BEARBEITEN

Ok, während der Recherche einiger Links, die Benutzer kommentiert haben, scheint die Verwendung des falschen Kontexts für das Laden von Aktivitäten dieses Problem verursachen zu können. Ich finde das interessant, weil eine der zwei Log-Meldungen, die mir zugesendet wurden, diese Ausnahme durch

W/ActivityManager( 1222): StartActivity aufgerufen von Nicht-Aktivitätskontext; Intent.FLAG_ACTIVITY_NEW_TASK für Intent { flg=0x20000 cmp=couk.doridori.goigoFull/.Games } erzwungen

was ziemlich selbsterklärend ist - das Problem ist, dass ich keine Ahnung habe, von wo aus diese Aktivität gestartet sein könnte, wo ein Nicht-Aktivitätskontext verwendet wird, also bin ich ein wenig ratlos, ich denke, es könnte eine Art Multitasking-Merkwürdigkeit sein und es wird wieder in den Vordergrund gebracht. Dies kann anscheinend Probleme mit dem Klassenlader verursachen. Wenn dies auf dem Telefon eines Benutzers passiert wäre, kann ich nicht sehen, warum ich dies nicht reproduzieren kann (und die meisten anderen Benutzer auch nicht).

Das andere, was ich durch die Links gefunden habe, ist interessant, dass einige Leute Probleme aufgrund einer "falschen APK-Installation" hatten, die durch eine Neuinstallation gelöst werden kann, was ich die Benutzer, die das Problem hatten, ausprobieren lassen habe (was keinen Unterschied macht). Es scheint auch, dass, sobald das Problem auftritt (was beim ersten Gebrauch passiert), es bestehen bleibt.

0 Stimmen

Hast du einen Broadcast-Empfänger mit dem Intent-Filter Intent.FLAG_ACTIVITY_NEW_TASK? Dies könnte der Nicht-Aktivitätskontext sein, der versucht, eine deiner Aktivitäten zu starten.

34voto

Reuben Scratton Punkte 38292

Ich kann nicht umhin zu bemerken, dass Ihr Aktivitätsname couk.doridori.goigoFull.Board ist, aber Ihre fehlende benutzerdefinierte View-Klasse ist couk.doridori.goigo.customUI.GoBoardView... Es sieht so aus, als ob Sie möglicherweise zwei verschiedene Pakete haben (goigo vs goigoFull).

Machen Sie vielleicht clevere Dinge mit Bibliotheksprojekten? Sie sollten wirklich vorsichtig sein mit vollqualifizierten Klassennamen im Code und im Layout-XML...

(Falls nicht, fügen Sie bitte einige weitere Informationen zu Ihrem Projekt-Setup hinzu und fügen Sie auch Ihr Layout-XML ein, an dem der Layoutinflater hängen bleibt)

0 Stimmen

Ah fantastisch, das habe ich nicht bemerkt - ich werde mich darum kümmern und bald zurückmelden, danke...

1 Stimmen

Ja, das war das Problem, das habe ich übersehen, da ich eine separate Layout-Datei für kleine Bildschirme hatte, in der ich den Paketnamen nicht aktualisiert hatte - was für eine dumme Sache, die ich getan habe :) Offenbar muss ich 23 Stunden warten, bevor ich Ihnen die Belohnung geben kann, also werde ich das tun. Wieder einmal sollte ich den Stapel gründlicher lesen!!

0 Stimmen

Hallo @Dori, freut mich, helfen zu können. Es ist durchaus möglich, dass ich ähnliche Fehler bereits gemacht habe. Es wäre wirklich hilfreich, wenn der Ressourcencompiler Verweise auf nicht vorhandene Pakete erkennen und als Fehler anzeigen würde...

7voto

Dalmas Punkte 25939

Ich habe bereits dieses Problem hier diskutiert: Android: Unable to instantiate activity / ClassNotFoundException, aber wir konnten keine endgültige Antwort finden... Allerdings ist Johns Antwort zum richtigen Gebrauch von Context interessant.

Einige Leute haben ihr Problem auch in diesem Thread gelöst und geben einige Ideen.

Hoffe, das hilft...

(Übrigens freut es mich, einen weiteren Go-Spielprogrammierer zu sehen!)

0 Stimmen

Ich bin mir nicht sicher, ob es sich um dasselbe Problem handelt, da diese Ausnahme scheinbar auf eine bestimmte Zeile (14) in einer der XML-Dateien verweist.

0 Stimmen

Ja, du hast recht, ich habe es nicht gesehen... Es gibt jedoch einige Gemeinsamkeiten: es handelt sich um dieselbe Ausnahme, er kann den Fehler nicht reproduzieren und es scheint zufällig zu passieren.

0 Stimmen

Hallo, vielen Dank für die Links und Antworten - Ich habe meinen Beitrag unten mit einigen weiteren Informationen / Gedanken aktualisiert. :)

3voto

Kiran Punkte 31

Ich habe ein benutzerdefiniertes Layout hinzugefügt und begann nur in der signierten Anwendungssammlung ClassNotFoundException-Meldungen zu sehen, aber das Entwicklungspaket funktionierte einwandfrei. Ich habe ProGuard verwendet und das neue Layout, das ich hinzugefügt hatte, war nicht in der "exclude" -Liste in der ProGuard-Konfiguration enthalten. Ich habe das benutzerdefinierte Layout in die ProGuard-Ausnahmeliste aufgenommen und das hat das Problem für mich behoben.

3voto

Dan Punkte 39

Manchmal treffe ich auf dieses Problem beim Entwickeln - normalerweise nach dem Ändern von Paketnamen. Ein schnelles Bereinigen des Projekts behebt das Problem für mich.

1voto

Christine Punkte 5479

Es gibt noch eine weitere Sache, die zu "ClassNotFoundException" führt. Vor einiger Zeit begann das Android-Projekt, das Verzeichnis "libs" für Abhängigkeiten zu verwenden. Wenn sich ein Jar im Verzeichnis "libs" befindet, ist es automatisch im Klassenpfad enthalten, sodass Sie es nicht in den Projekteinstellungen hinzufügen müssen. Jars in "libs" können jedoch keine Quellen angehängt haben (was lächerlich ist). Wenn Sie also eine Quelle anhängen möchten, verschieben Sie ein Jar von "libs" nach "lib" und fügen es dem Klassenpfad hinzu. Sie können die Quelle anhängen. Ich habe jedoch schon mehrmals gesehen, dass dies zu ClassNotFoundExceptions in meinen Klassen führt. Das Zurückverschieben des Jars löst das Problem.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X