java.lang.NoClassDefFoundError 在某些设备中被抛出,但不是全部
java.lang.NoClassDefFoundError being thrown In some devices, but not all
我从 Google 为我的 Android 应用程序获取崩溃分析,我偶尔会看到这个弹出窗口:
java.lang.NoClassDefFoundError
关于尝试打开 Intent。
场景是,用户点击按钮,我在应用程序中的代码是:
Intent intent = new Intent(nameOfCurrentActivity.this, nameOfNewActivity.class);
startActivity(intent);
非常简单的东西。它几乎适用于所有设备,包括我拥有并测试过的所有设备。这个正在启动的新 class 并不是独一无二的,因为它需要任何奇怪的硬件(IE,而不是相机 activity),但它确实通过 Http 请求访问互联网。
我已经研究了以下链接,但没有获得解决方案的提示:
- Why am I getting a NoClassDefFoundError in Java?
- How to solve java.lang.NoClassDefFoundError?
我的问题是,为什么会在某些设备(IE,三星平板电脑)上抛出此异常,但在其他设备上不会? 如果新 Intent 在一台设备上有效,难道它不应该在所有设备上都有效吗?
谢谢!
很多时候这可能是由 classes 运行 代码引起的,该代码依赖于某个 API 级别,IE Marshmallow,但使用它的设备是在之前的 API 和 中,权限检查被忽略或不包括在内;就像您单击禁用检查时一样。
例如,假设您是 运行 类似 View.OnScrollChangeListener 的 recyclerview。如果您正在编码并设置它:
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
myRecyclerview.setOnScrollChangeListener(this);
}
但是如果检查不包括构建,它会抛出错误。另一个例子是,如果您使用 class 本身作为设置滚动侦听器的上下文 (this)。如果您使用 class 本身作为扩展 Scroll 侦听器的上下文,但在设备 Pre-API 21 上,它将在 class 加载时抛出错误。正如您可能猜到的那样,它抛出的错误是 NoClassDefError。
发生这种情况是因为 'future' API 中提到的 Class 在旧的 phone 中不存在,因此找不到 class 定义。
检查您的代码以查看 class 中是否有任何内容需要特定的 API 级别才能运行,如果需要,请检查以确认您包括了构建版本的 if 检查。在我禁用检查之前有很多次,因为红线困扰着我,忘记回去添加检查。
我今天只是想补充一下自己的经验。显然 Supplier 存在于 Java 8 中,但是它的实现和 运行 它在 Marshmallow 上的实现会生成 NoClassDefFoundError。我能够通过声明自定义 MySupplier 来解决问题。我试图添加为评论但失败了。感谢上面user7293284的解释
我从 Google 为我的 Android 应用程序获取崩溃分析,我偶尔会看到这个弹出窗口:
java.lang.NoClassDefFoundError
关于尝试打开 Intent。
场景是,用户点击按钮,我在应用程序中的代码是:
Intent intent = new Intent(nameOfCurrentActivity.this, nameOfNewActivity.class);
startActivity(intent);
非常简单的东西。它几乎适用于所有设备,包括我拥有并测试过的所有设备。这个正在启动的新 class 并不是独一无二的,因为它需要任何奇怪的硬件(IE,而不是相机 activity),但它确实通过 Http 请求访问互联网。
我已经研究了以下链接,但没有获得解决方案的提示:
- Why am I getting a NoClassDefFoundError in Java?
- How to solve java.lang.NoClassDefFoundError?
我的问题是,为什么会在某些设备(IE,三星平板电脑)上抛出此异常,但在其他设备上不会? 如果新 Intent 在一台设备上有效,难道它不应该在所有设备上都有效吗?
谢谢!
很多时候这可能是由 classes 运行 代码引起的,该代码依赖于某个 API 级别,IE Marshmallow,但使用它的设备是在之前的 API 和 中,权限检查被忽略或不包括在内;就像您单击禁用检查时一样。
例如,假设您是 运行 类似 View.OnScrollChangeListener 的 recyclerview。如果您正在编码并设置它:
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
myRecyclerview.setOnScrollChangeListener(this);
}
但是如果检查不包括构建,它会抛出错误。另一个例子是,如果您使用 class 本身作为设置滚动侦听器的上下文 (this)。如果您使用 class 本身作为扩展 Scroll 侦听器的上下文,但在设备 Pre-API 21 上,它将在 class 加载时抛出错误。正如您可能猜到的那样,它抛出的错误是 NoClassDefError。
发生这种情况是因为 'future' API 中提到的 Class 在旧的 phone 中不存在,因此找不到 class 定义。
检查您的代码以查看 class 中是否有任何内容需要特定的 API 级别才能运行,如果需要,请检查以确认您包括了构建版本的 if 检查。在我禁用检查之前有很多次,因为红线困扰着我,忘记回去添加检查。
我今天只是想补充一下自己的经验。显然 Supplier