通过 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

ClassNotFoundException 与 NoClassDefFoundError

Maven 依赖的 NoClassDefFoundError