第一个例子:
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) throws Exception {
try {
throw new RuntimeException(new NullPointerException("NPE"));
} catch (RuntimeException e) {
logger.error("Error:", e);
}
}
}
输出:
Error:
java.lang.RuntimeException: java.lang.NullPointerException: NPE
at Main.main(Main.java:10)
在第二个示例中,我们还向
RuntimeException
添加了一条消息:throw new RuntimeException("RTE", new NullPointerException("NPE"));
输出:
Error:
java.lang.RuntimeException: RTE
at Main.main(Main.java:10)
为什么在这种情况下不登录
NullPointerException
?注意:两种情况下,
e.printStackTrace()
都将输出两种异常:java.lang.RuntimeException: RTE
at Main.main(Main.java:10)
Caused by: java.lang.NullPointerException: NPE
... 1 more
版本:
slf4j-api: 1.7.12
slf4j-log4j12: 1.7.12
log4j: 1.2.17
最佳答案
可以尝试使用所有文档并进行调试,我希望它能以任何方式帮助您:
@param message the message object to log.
@param t the exception to log, including its stack trace.
public void error(Object message, Throwable t)
因此,您的两种情况都包括代码语句引发的RuntimeException的堆栈跟踪。没有太大的区别。
案例1 :
throw new RuntimeException(new NullPointerException("NPE"));
引用RuntimeException Java-Doc和NullPointerException Java-Doc
public RuntimeException(Throwable cause)
public NullPointerException(String s)
因此,这可能会回答您的问题的第一部分,其中在执行期间抛出
java.lang.RuntimeException
,这是由new NullPointerException
引起的,但是由于cause==null
评估为false,因此会打印cause.toString()
,即 java.lang.NullPointerException
,现在由于此异常本身已传递了一条消息作为 NPE
注意:您在代码中已将原因提到为NullPointerException。(因此
cause==null
的计算结果为false)案例2 :
throw new RuntimeException("RTE", new NullPointerException("NPE"))
public RuntimeException(String message, Throwable cause)
在这种情况下,您最终会导致
java.lang.RuntimeException
被引发,并显示一条消息 RTE
,因为您的原因是RuntimeException
本身的子级,并且父级被首先捕获,在这种情况下,它将被执行且未达到子级。关于java - 当包装程序异常包含消息时,带有Log4j的Slf4j不会打印包装的异常(由),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36507554/