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

时间:2016-11-29 23:32:33

标签: android android-intent noclassdeffounderror

我从谷歌那里获得了我的Android应用程序的Crash Analytics,我偶尔会看到这个弹出窗口:

java.lang.NoClassDefFoundError

关于尝试打开意图。

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

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

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

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

我的问题是,如何在某些设备(IE,三星平板电脑),而不是其他设备上抛出此异常?应该&# 39;如果所有设备都在一个设备上工作,那么它的新意图是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

例如,您正在运行类似于View.OnScrollChangeListener的内容,以获取recyclerview。如果您正在编码并设置它:

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

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

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

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

答案 1 :(得分:0)

我今天想补充一下自己的经验。显然Supplier 在Java 8中存在,但是对其的实现并在棉花糖上运行会生成NoClassDefFoundError。我可以通过声明自定义MySupplier 来解决此问题。我试图添加为评论,但失败了。感谢您上面的user7293284给出的解释。