java.lang.NoClassDefFoundError:[generic] at dalvik.system.NativeStart.main(Native Method)

时间:2014-02-27 15:54:26

标签: java android noclassdeffounderror dalvik

我的应用程序的一些用户遇到了此异常

java.lang.NoClassDefFoundError: [generic] 
at dalvik.system.NativeStart.main(Native Method)

这不是常见的例外,因为有大量用户,只有部分用户有此异常。我不使用任何本机库,所有外​​部库都不使用任何本机代码

发生这种情况的Android版本:

  1. Android 4.0.3 - 4.0.4 (97.7%)
  2. Android 4.0 - 4.0.2 (1.5%)
  3. Android 4.1 (0.8%)
  4. 任何人都可以帮我解决问题吗? AndroidManifest中的接收器可以调用此问题吗?

1 个答案:

答案 0 :(得分:7)

具有NoClassDefFoundError标记的

[generic]由VM从“预制”对象抛出。该异常没有有用的堆栈跟踪,但通常不会单独出现。

背景:类加载器机制需要在加载器中找不到类时抛出异常。加载器必须遵循其父加载器,因此如果您尝试加载应用程序类,它将首先询问引导加载程序,它将失败并抛出异常。然后,app loader会自己进行查找,这可能会成功。

这意味着VM正在分配一个异常,初始化对象,并填充堆栈跟踪......然后将其丢弃,用于每个未从引导类加载器中出来的类。

为了避免无意义的分配,引导加载程序(在VM内部实现)会抛出一个通用的预分配异常对象。因为在VM启动时对象完全形成,所以它没有有意义的堆栈跟踪信息。

实际上你没有看到这些,因为应用程序通常不直接从引导加载程序加载类。应用程序或系统加载程序为您创建一个有意义的例外。即使您直接从引导加载程序请求类,您也应该只将其视为ClassNotFoundException的“原因”。

DexClassLoader被编写为在找不到类时使用错误代码而不是异常,因此您不会通过该路径看到这一点。

如果NoClassDefFoundError是更大异常的“原因”,则需要获取最外层异常,因为它将具有有意义的堆栈跟踪。如果您看到它们自己出现,那么一些非常奇怪的事情正在进行 - 很可能一些代码试图直接加载类并传递null而不是类加载器对象(这是您引用的方式)引导加载程序)。