未打印Java异常Stacktrace

问题描述 投票:5回答:8

我有以下代码:

import org.apache.commons.lang.exception.ExceptionUtils;
public void myMethod() {
    try {
        // do something
    } catch (Exception e) {
        System.out.println(ExceptionUtils.getStackTrace(e)); // prints "java.lang.NullPointerException"
        System.out.println(ExceptionUtils.getFullStackTrace(e)); // prints "java.lang.NullPointerException"
        e.printStackTrace(); // prints "java.lang.NullPointerException"
    }
}

我想看到的输出是一个完整的堆栈跟踪,其中包含行号和失败类的层次结构。例如,

Exception in thread "main" java.lang.NullPointerException
        at org.Test.myMethod(Test.java:674)
        at org.TestRunner.anotherMethod(TestRunner.java:505)
        at java.util.ArrayList(ArrayList.java:405)

此代码正在具有log4j的较大应用程序中运行,但我希望能够将异常转换为字符串,以便将其作为电子邮件发送给Java开发人员。

关于我如何将整个堆栈跟踪捕获到字符串,是否有人有任何想法?由于此应用程序在Java 4上运行,因此我无法使用Thread.currentThread()。getStackTrace()。是什么可能导致上述代码无法打印完整的堆栈跟踪信息?

java exception logging exception-handling log4j
8个回答
3
投票

[异常可能在catch块之前被捕获并抛出了。也许您正在调用另一个类来做逻辑。

创建为Exceptionnew Exception(new Throwable("java.lang.NullPointerException"));将打印出与您看到的类似的东西。


15
投票

这是因为在服务器模式下运行时,java会进行一些代码优化(java -server)跳过这个。在Java参数中使用-XX:-OmitStackTraceInFastThrow有关详细信息,请参见下面的链接:

http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/


11
投票

如果反复抛出异常,JVM将停止填充堆栈跟踪。我不知道为什么,但是可能是为了减少JVM的负载。您需要查看以前的堆栈跟踪才能查看详细信息。

for (int n = 0; ; n++) {
    try {
        Integer i = null;
        i.hashCode();
    } catch (Exception e) {
        if (e.getStackTrace().length == 0) {
            System.out.println("No more stack trace after " + n + " thrown.");
            break;
        }
    }

打印

No more stack trace after 20707 thrown.

2
投票

关于我如何将整个堆栈跟踪捕获到字符串,是否有人有任何想法?

您可以使用以下方式(StringWriter.toString())将堆栈跟踪传输到字符串中。

 StringWriter writer = new StringWriter();
 e.printStackTrace( new PrintWriter(writer,true ));
 System. out.println("exeption stack is :\n"+writer.toString());

1
投票

可能您没有控制台输出的附加程序。您考虑添加一个。如果不是,则将其记录为LOGGER.error(ex);。使用log4j或SLF4J]


1
投票

我只能想到两个原因,为什么e.printStackTrace()可能只输出字符串"java.lang.NullPointerException"

  • 该异常可能调用了setStackTrace(new StackTraceElement[0])
  • 异常对象可能是棘手的类的实例,该类重写了printStackTrace()或其他方法以返回误导性信息。

0
投票

请确保您使用的是e.printStackTrace(),而不是e.getStackTrace();


0
投票

什么可能会阻止上述代码显示完整的堆栈跟踪?

就我而言,正在捕获的Exception的超类具有此代码:

/* avoid the expensive and useless stack trace for api exceptions */
@Override
public Throwable fillInStackTrace() {
    return this;
}

这意味着堆栈跟踪数组从未被填充,所以我得到的只是:

org.apache.kafka.AuthException: Auth failed: Invalid username or password

没有堆栈信息,所以不知道where发生。可爱。

© www.soinside.com 2019 - 2024. All rights reserved.