【发布时间】: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