我有以下代码:
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()。是什么可能导致上述代码无法打印完整的堆栈跟踪信息?
[异常可能在catch块之前被捕获并抛出了。也许您正在调用另一个类来做逻辑。
创建为Exception
的new Exception(new Throwable("java.lang.NullPointerException"));
将打印出与您看到的类似的东西。
这是因为在服务器模式下运行时,java会进行一些代码优化(java -server)跳过这个。在Java参数中使用-XX:-OmitStackTraceInFastThrow
有关详细信息,请参见下面的链接:
如果反复抛出异常,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.
关于我如何将整个堆栈跟踪捕获到字符串,是否有人有任何想法?
您可以使用以下方式(StringWriter.toString())将堆栈跟踪传输到字符串中。
StringWriter writer = new StringWriter();
e.printStackTrace( new PrintWriter(writer,true ));
System. out.println("exeption stack is :\n"+writer.toString());
可能您没有控制台输出的附加程序。您考虑添加一个。如果不是,则将其记录为LOGGER.error(ex);。使用log4j或SLF4J]
我只能想到两个原因,为什么e.printStackTrace()
可能只输出字符串"java.lang.NullPointerException"
。
setStackTrace(new StackTraceElement[0])
。printStackTrace()
或其他方法以返回误导性信息。请确保您使用的是e.printStackTrace(),而不是e.getStackTrace();
什么可能会阻止上述代码显示完整的堆栈跟踪?
就我而言,正在捕获的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发生。可爱。