【问题标题】:Hints on analyzing the stacktrace via the example of NoClassDefFoundError通过 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

标签: java exception noclassdeffounderror classnotfoundexception


【解决方案1】:
  1. classloaders.ClassLoadersTest.main(ClassLoadersTest.java:9) at

  2. 运行时系统。试试

    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 源才能找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
相关资源
最近更新 更多