安卓ClassNotFoundException

34

我的一个应用程序出了问题,我想知道是什么原因导致的。我遇到了一个ClassNotFoundException错误,以下是关键代码行:

E/AndroidRuntime(21982): Caused by: java.lang.ClassNotFoundException: couk.doridori.goigo.customUI.GoBoardView in loader dalvik.system.PathClassLoader@446fc3d0

现在这个应用已经发布了一年多,2天前我收到两个不同的用户联系我反映这个问题,一个使用HTC wildfire (2.1),另一个使用三星 Galaxy S (?)。但是我无法在我的设备上(2.2和1.6)或模拟器(2.1)上重现这个问题,并且无法弄清楚为什么类加载器找不到这个类。我已经搜索了一段时间,但没有任何进展,希望有人能提供一些指引!似乎只有当加载一个 activity 并且设置 contentView 时,它才会尝试膨胀一个名为 GoBoardView 的自定义视图,该视图扩展了 View 类,仅进行一些简单的画布绘制,没有使用任何第三方库或会导致包命名冲突的其他类。

请帮忙!以防万一是构建问题,我正在通过 Eclipse 更新所有的 SDK 和 ADT,因为它是针对 1.6 构建并使用旧版 ADT,但我不知道这是否有所帮助,只是觉得值得一试。感谢您的任何建议!(请参见下面的编辑)

E/AndroidRuntime(21982): java.lang.RuntimeException: Unable to start activity ComponentInfo{couk.doridori.goigoFull/couk.doridori.goigoFull.Board}: android.view.InflateException: Binary XML file line #14: Error inflating class couk.doridori.goigo.customUI.GoBoardView
E/AndroidRuntime(21982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2596)
E/AndroidRuntime(21982): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
E/AndroidRuntime(21982): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
E/AndroidRuntime(21982): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
E/AndroidRuntime(21982): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(21982): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(21982): at android.app.ActivityThread.main(ActivityThread.java:4603)
E/AndroidRuntime(21982): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(21982): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(21982): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(21982): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(21982): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(21982): Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class couk.doridori.goigo.customUI.GoBoardView
E/AndroidRuntime(21982): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576)
E/AndroidRuntime(21982): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
E/AndroidRuntime(21982): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
E/AndroidRuntime(21982): at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
E/AndroidRuntime(21982): at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime(21982): at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime(21982): at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime(21982): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207)
E/AndroidRuntime(21982): at android.app.Activity.setContentView(Activity.java:1629)
E/AndroidRuntime(21982): at couk.doridori.goigoFull.Board.onCreate(Board.java:31)
E/AndroidRuntime(21982): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(21982): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
E/AndroidRuntime(21982): ... 11 more
E/AndroidRuntime(21982): Caused by: java.lang.ClassNotFoundException: couk.doridori.goigo.customUI.GoBoardView in loader dalvik.system.PathClassLoader@446fc3d0
E/AndroidRuntime(21982): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
E/AndroidRuntime(21982): at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
E/AndroidRuntime(21982): at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
E/AndroidRuntime(21982): at android.view.LayoutInflater.createView(LayoutInflater.java:466)
E/AndroidRuntime(21982): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
E/AndroidRuntime(21982): ... 22 more

编辑

好的,研究了一些用户在回复这个问题时提供的链接,似乎在加载活动时使用错误的上下文可能会导致此问题。我觉得这很有趣,因为我收到的两份日志报告中的其中之一在此异常之前出现了。

W/ActivityManager( 1222): startActivity called from non-Activity context; forcing Intent.FLAG_ACTIVITY_NEW_TASK for: Intent { flg=0x20000 cmp=couk.doridori.goigoFull/.Games }

这很容易理解——问题是我不知道这个活动从哪里开始,它使用了一个非活动上下文,所以我有点困惑,认为可能是一些多任务的怪癖,并且被带回到某个前景中。这显然会导致ClassLoader的问题。如果这在用户手机上发生,我不明白为什么我无法重现这个问题(大多数其他用户也不能)。

我在链接中发现的另一件有趣的事情是,有些人遇到了由于“错误的apk安装”而引起的问题,可以通过重新安装来解决,我已经要求遇到问题的用户尝试过(但没有改变)。此外,似乎一旦出现问题(在第一次使用时),它就会持续存在。


你是否有一个带有 Intent.FLAG_ACTIVITY_NEW_TASK 意图过滤器的广播接收器?这可能是非活动上下文,它可能会尝试启动你的某个活动。 - John J Smith
9个回答

34
我注意到您的Activity名称是couk.doridori.goigoFull.Board,但您缺少自定义View类couk.doridori.goigo.customUI.GoBoardView...看起来您可能有两个不同的包(goigo vs goigoFull)。

您是否在使用库项目进行一些聪明的事情?在代码和布局xml中需要非常小心地处理全限定类名...

(如果没有,请添加有关项目设置的更多信息,并粘贴您的布局XML,其中layoutinflater被阻塞了)


啊,太棒了,我之前没有注意到这个问题 - 我会调查一下并尽快回复,谢谢... - Dori
1
是的,这就是问题所在。我忽略了这一点,因为我针对小屏幕有一个单独的布局文件,在这个文件中我没有更新包名 - 做这样的事情真是太愚蠢了 :) 显然我不得不等待23个小时才能授予您赏金,所以我会等待。再次感谢,我应该更仔细地阅读堆栈信息!! - Dori
嗨 @Dori,很高兴能够帮忙。说实话,我以前也犯过非常类似的错误。如果资源编译器能捕捉到对不存在的软件包的引用并将其作为错误提出来,那肯定会很有帮助... - Reuben Scratton
谢谢您,我遇到了同样的问题,那是因为拼写错误,非常感谢 :) - Mahmoud Farahat
我必须说声谢谢,我也遇到了这个愚蠢的问题。我没有仔细阅读异常信息。 - Sean

7
我已经在这里讨论了这个问题:Android: Unable to instantiate activity / ClassNotFoundException,但我们没有找到一个明确的答案...不过John J Smith关于正确使用Context的回答很有趣。
一些人也在这个帖子上解决了他们的问题并提供了一些想法。
希望这可以帮到你...
(顺便说一句,我很高兴看到另一个围棋程序员!)

我不确定这是否与此问题相同,因为该异常似乎指向 XML 文件中的特定行(第14行)。 - John J Smith
是的,你说得对,我没有看到它...然而有一些共同点:它是相同的异常,他无法重现错误,并且似乎是随机发生的。 - Dalmas
你好,感谢提供链接和答案。我在文章底部更新了更多的信息/想法。 :) - Dori
另外,您提供的链接似乎是针对所有用户的应用程序启动,并且其他链接所述似乎是关于从通知中重新启动应用程序(我的应用程序没有通知),因此类似但我的应用程序确实启动,因此我感觉不能排除与SD卡相关的错误。顺便问一下,您正在开发什么样的Go项目? - Dori

3

我添加了一个自定义布局,但只有在已签名的应用程序包中才会看到ClassNotFoundException消息,而开发构建则完全正常。我正在使用ProGuard,而我添加的新布局未包含在ProGuard配置文件的“排除”列表中。我将自定义布局包含在ProGuard的排除列表中,这为我解决了问题。


3

在开发过程中有时会遇到这个问题 - 通常是在更改包名称后。对项目进行快速清理可以解决我的问题。


1
我曾经遇到过同样的问题。最终发现问题只是布局XML中缺少了制表符。
之前的代码:
    <org.osmdroid.views.MapView
    android:id="@+id/mapview"
    android:layout_width="fill_parent" 
    android:layout_height="0dip"
    tilesource="MapquestOSM" 
    android:layout_weight="1"
    />

然后使用缩进,ClassNotFoundException就再也没有出现过,地图也正常显示了:

    <org.osmdroid.views.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent" 
        android:layout_height="0dip"
        tilesource="MapquestOSM" 
        android:layout_weight="1"
    />

8
也许你实际上需要重建你的项目,我敢打赌缩进并没有什么关系 ^^ - thelawnmowerman

1

还有一件事会导致“ClassNotFoundException”。不久前,Android项目开始使用libs目录来管理依赖项。如果一个jar包在libs目录中,它会自动添加到类路径中,因此您不必在项目设置中添加它。但是,“libs”中的jar包无法附加源代码(这太荒谬了)。因此,如果您想要附加源代码,您需要将jar包从“libs”移动到“lib”,并将其添加到类路径中。您可以附加源代码。但我已经看到过几次,这会触发我的类上的ClassNotFoundException。将jar包移回“libs”即可解决问题。


1

我的经验是 Android SDK 已经更新,支持库的链接需要被刷新。只需要到项目设置 > Android 中再次指向支持库即可。


1

对我来说,问题在于一个小写字母错误。 我花了几个小时查找我的代码,一切都没问题。 有时候我看了看我的 .xml 文件 - 然后就发现了:

在 java 文件中,我使用了一个 ViewPager,在 xml 的一个令人讨厌的小地方,我失去了大写并错误地输入了 viewPager。很明显,这个无法被找到...


0

这是由于Eclipse的新版本...需要从构建路径中删除所有外部依赖项,然后使用项目->属性->构建路径->库选项卡再次添加它们。现在重新添加所有依赖库,并通过在项目->属性->构建路径-中对它们进行单击来选择所有组件。这将正常工作!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接