【问题标题】:java.lang.NoClassDefFoundError being thrown In some devices, but not alljava.lang.NoClassDefFoundError 在某些设备中被抛出,但不是全部
【发布时间】:2016-11-29 23:32:33
【问题描述】:

我从 Google 获得了针对我的 Android 应用的崩溃分析,并且我偶尔会看到此弹出窗口:

java.lang.NoClassDefFoundError

关于尝试打开 Intent。

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

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

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

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

我的问题是,怎么可能在某些设备(IE、三星平板电脑)上引发此异常,而不是其他设备?如果新意图适用于一个设备,它是否适用于所有设备?

谢谢!

【问题讨论】:

  • 能否请您提供意图来自和去向的两个类文件?
  • 在启动应用到商店之前,您是否尝试过解决安卓版本的兼容性问题?
  • @jace 不幸的是,我无法提供该课程,因为我处于 NDA 之下,无法显示源代码。在没有相关数据的情况下,我明天会尽力重建它。关于兼容性问题,您能澄清一下您的意思吗?

标签: android android-intent noclassdeffounderror


【解决方案1】:

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

例如,假设您正在为回收视图运行 View.OnScrollChangeListener 之类的东西。如果您正在编码并设置它:

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

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

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

检查您的代码以查看类中是否有任何需要特定 API 级别才能运行的内容,如果是,请检查以确认您是否包含了构建版本的 if 检查。在我禁用检查之前很多次,因为红线困扰着我,忘记返回并添加检查。

【讨论】:

  • 这绝对是问题所在。我在活动本身中设置了各自的仅 Marshmallow 接口(实现),这导致以前的版本(Pre-API 21,但不是所有手机)在打开时崩溃。很好的收获。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多