抛出java.lang.NoClassDefFoundError在某些设备中,但不是全部

问题描述 投票:1回答:2

我从谷歌获得了Crash Analytics for Android app,我偶尔会看到这个弹出窗口:

java.lang.NoClassDefFoundError

关于试图打开一个意图。

方案是,用户点击按钮,他们在应用程序中的代码是:

Intent intent = new Intent(nameOfCurrentActivity.this, nameOfNewActivity.class);
startActivity(intent);

很简单的东西。它几乎适用于所有设备,包括我拥有并经过测试的所有设备。这个新类正在启动并不是唯一的,因为它需要任何奇怪的硬件(IE,而不是相机活动),但它确实通过Http请求访问互联网。

我已经研究过以下链接而没有获得解决方案的提示:

我的问题是,如何在某些设备(IE,三星平板电脑)上抛出此异常,而不是其他设备?如果一个新的意图适用于所有设备,它是否应该适用于所有设备?

谢谢!

android android-intent noclassdeffounderror
2个回答
3
投票

很多时候,这可能是由运行代码的类引起的,这些代码依赖于它是某个API级别,IE Marshmallow,但使用它的设备是在先前的API上,并且对权限的检查被忽略或不包括在内;就像你点击禁用检查一样。

例如,您正在为Recyclerview运行类似View.OnScrollChangeListener的内容。如果您正在编码并设置它:

    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
        myRecyclerview.setOnScrollChangeListener(this);
    }

但是如果检查不包含构建,它将抛出错误。另一个例子是,如果您使用类本身作为上下文(this)来设置滚动侦听器。如果您使用类本身作为扩展Scroll侦听器但是在设备Pre-API 21上的上下文,它将在类加载时抛出错误。正如您可能猜到的那样,它抛出的错误是NoClassDefError。

发生这种情况是因为“未来”API中提到的类在旧手机中尚不存在,因此找不到定义的类。

检查您的代码以查看类中是否有任何要求某个API级别正常运行的功能,如果是,请检查以确认是否包含if检查构建版本。在我禁用检查之前很多次因为红线让我烦恼而又忘了回去添加支票。


0
投票

我只想今天加入自己的经验。显然,Supplier 8中存在Supplier <T>,但是在Marshmallow上运行它并生成NoClassDefFoundError。我能够通过声明自定义MySupplier <T>来解决问题。我试图添加评论但失败了。感谢上面的user7293284给出的解释。

© www.soinside.com 2019 - 2024. All rights reserved.