我的应用程序的一些用户遇到了此异常
java.lang.NoClassDefFoundError: [generic]
at dalvik.system.NativeStart.main(Native Method)
这不是常见的例外,因为有大量用户,只有部分用户有此异常。我不使用任何本机库,所有外部库都不使用任何本机代码
发生这种情况的Android版本:
任何人都可以帮我解决问题吗? AndroidManifest中的接收器可以调用此问题吗?
答案 0 :(得分:7)
NoClassDefFoundError
标记的 [generic]
由VM从“预制”对象抛出。该异常没有有用的堆栈跟踪,但通常不会单独出现。
背景:类加载器机制需要在加载器中找不到类时抛出异常。加载器必须遵循其父加载器,因此如果您尝试加载应用程序类,它将首先询问引导加载程序,它将失败并抛出异常。然后,app loader会自己进行查找,这可能会成功。
这意味着VM正在分配一个异常,初始化对象,并填充堆栈跟踪......然后将其丢弃,用于每个未从引导类加载器中出来的类。
为了避免无意义的分配,引导加载程序(在VM内部实现)会抛出一个通用的预分配异常对象。因为在VM启动时对象完全形成,所以它没有有意义的堆栈跟踪信息。
实际上你没有看到这些,因为应用程序通常不直接从引导加载程序加载类。应用程序或系统加载程序为您创建一个有意义的例外。即使您直接从引导加载程序请求类,您也应该只将其视为ClassNotFoundException
的“原因”。
DexClassLoader
被编写为在找不到类时使用错误代码而不是异常,因此您不会通过该路径看到这一点。
如果NoClassDefFoundError
是更大异常的“原因”,则需要获取最外层异常,因为它将具有有意义的堆栈跟踪。如果您看到它们自己出现,那么一些非常奇怪的事情正在进行 - 很可能一些代码试图直接加载类并传递null
而不是类加载器对象(这是您引用的方式)引导加载程序)。