通过 NoClassDefFoundError 示例分析堆栈跟踪的提示
Posted
技术标签:
【中文标题】通过 NoClassDefFoundError 示例分析堆栈跟踪的提示【英文标题】:Hints on analyzing the stacktrace via the example of NoClassDefFoundError 【发布时间】:2014-08-30 13:12:35 【问题描述】:我有以下代码。编译后我删除 MyClassToLoad.class 文件并运行代码。
public class ClassLoadersTest
public static void main(String[] args)
MyClassToLoad c = new MyClassToLoad();
我得到以下堆栈跟踪:
线程“主”java.lang.NoClassDefFoundError 中的异常: 类加载器/MyClassToLoad 在 类加载器.ClassLoadersTest.main(ClassLoadersTest.java:9) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
引起:java.lang.ClassNotFoundException: 类加载器.MyClassToLoad 在 java.net.URLClassLoader$1.run(URLClassLoader.java:200) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:188) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:303) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 在 java.lang.ClassLoader.loadClassInternal(ClassLoader.java:316) ... 6 更多
据我了解,这个堆栈跟踪意味着有一个 ClassNotFoundException,它被捕获并作为 NoClassDefFoundError 重新抛出。
问题是:
1) 我如何了解重新抛出发生在哪一行?
2) 谁用“... 6 more”切断堆栈跟踪 - Java 还是 Idea?我怎样才能看到它满了?
3) 据我了解,强制重新抛出的异常包含我们需要重新抛出的完整堆栈跟踪
throw new SomeRethrownException("some text", exceptionWhichIsTheReason)
但是 NoClassDefFoundError 没有这样的构造函数。所以实际上它不应该打印完整的堆栈跟踪。或者他们只是把它作为错误消息作为字符串?
【问题讨论】:
ClassNotFoundException 堆栈跟踪中的“... 6 more”条目正是 NoClassDefFoundError 跟踪中的六个条目。 斯图尔特,总是这样? 通常是的,截断的条目通常与封闭异常的条目相同。见Throwable.printStackTrace。 【参考方案1】:classloaders.ClassLoadersTest.main(ClassLoadersTest.java:9) at
运行时系统。试试
public static void main(String[] args)
try
MyClassToLoad c = new MyClassToLoad();
catch (java.lang.NoClassDefFoundErro e)
e.getCause().printStackTrace();
至于3,看我对2的回答。
【讨论】:
Elliot,在第 9 行有一行“MyClassToLoad c = new MyClassToLoad()”。没有重新抛出。看起来我不知道确切的线路? 运行时系统是指Idea? @Dymytry 那是确切的行。您删除了 .class 文件,这是导致 ClassLoader 尝试解析类并调用MyClassToLoad
构造函数的第一行。运行时系统是指 java。
Elliot,我的意思是写“throw new NoClassDefFoundError()”的那一行。
@Dymytry 它很可能出现在实现 Java 的 C++ 本机代码中。您需要获取 JDK 源才能找到它。以上是关于通过 NoClassDefFoundError 示例分析堆栈跟踪的提示的主要内容,如果未能解决你的问题,请参考以下文章
通过检测字节码调用类的静态方法时出现 NoClassDefFoundError
Tomcat项目产生NoClassDefFoundError
Intellij 插件中的 java.lang.NoClassDefFoundError
在 Google App Engine 上通过 OKClient 使用 OkHttp 客户端会引发“java.lang.NoClassDefFoundError: java.net.ProxySele