如何在终端上打印所有Java异常?

14

我注意到每当终端上抛出异常时,我经常会得到一个类似于以下缩写故障跟踪:

java.lang.NoClassDefFoundError: javafx/application/Application
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javafx.application.Application
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 13 more
Exception in thread "main" 

我想知道如何打印所有的跟踪信息,包括那些...13 more

编辑:这篇文章被认定为可能是Print full call stack on printStackTrace()?的重复。我确实阅读了后者,但没有找到答案,只发现了关于为什么会发生这种情况的信息。


实际上..它会打印整个内容..这里出现问题的是你的控制台...增加你的控制台页面行数(或使其无限制),然后你将获得完整的列表。 - Pavan Kumar K
4
请打开以下链接以查看如何在Java中打印完整的调用堆栈:https://dev59.com/iHNA5IYBdhLWcg3wPLL- - chengpohi
那么我该如何在我的控制台中实现这些更改,@PavanKumarK?顺便说一下,我正在使用win7,也许这与问题有关。 - Maslor
为什么在已经打印的行中已经有13个,你还想看到另外13个呢? - Dragan Bozanovic
4个回答

4

您可以将Throwable对象(在您的情况下为Exception)传递给以下方法:

static void printFullTrace(Throwable throwable){
    for(StackTraceElement element: throwable())
        System.out.println(element);
}

事实上,这些行中已经显示了整个堆栈跟踪,因为其中一部分是重复的,为了简洁起见而省略了。你可以在这里更好地理解这个机制。


虽然这确实是非常有用的信息,但我正在寻找的,如果存在的话,是一种简单的方法来使我的命令行打印所有的跟踪,而不是写“...13 more”。@PavanKumarK在评论中说你可以增加控制台的页面行数,但他还没有开发出他的答案...这可能吗? - Maslor
@Maslor:我已经添加了它。 - enrico.bacis
感谢澄清! - Maslor

0
StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTraces) {
    System.out.println(element);
}

如果有的话,我正在寻找一种不需要向我的应用程序添加代码的替代简单方法。 - Maslor
http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace() 这个足够了吗?还是有你知道但不想分享的东西? - Recoba20

0

您可以通过以下方法打印整个堆栈跟踪。阅读printStackTrace的Java文档将会告诉您为什么设计成这样。

void printAllTraces(Throwable throwable) {
       StackTraceElement[] stackTraces = throwable.getStackTrace();
       for (StackTraceElement stackTrace: stackTraces) {
          System.out.println(stackTrace); 
       }
}

如果有的话,我正在寻找一种不需要向我的应用程序添加代码的替代简单方法。 - Maslor
1
printStackTrace只能提供这么多信息,它的设计目的是简洁明了。所以如果不添加一些代码,恐怕无法获取完整的堆栈跟踪。 - sakthisundar

-1

标准的Windows控制台(cmd)功能非常有限,您需要安装一个强大的控制台,例如那些已经存在的,这样您就可以拥有更大的滚动区域。请查看此处列出的替代方案。

个人建议使用cmder,虽然它不在列表中,但您必须测试所有选项并选择最适合您的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接