第一个例子:

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-DocNullPointerException 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/

10-12 06:09