java - 如何在没有堆栈跟踪的情况下创建/抛出异常?

标签 java nullpointerexception

<分区>

我今天在浏览一些日志时遇到了一个奇怪的错误。

这是它在日志中的显示方式:

2014/09/11 15:23:52.801 [CC3A5FDD16035540B87F1B8C5E806588:<removed>] WARN a.b.c.Ddd - Main failure 
java.lang.NullPointerException: null
2014/09/11 15:23:52.801 [CC3A5FDD16035540B87F1B8C5E806588:<removed>] ...

代码如下:

} catch (Exception e) {
    Ddd.log.warn("Main failure ", e);
    throw e;
}

如果这很重要,代码在 jsp 中。同样的异常在日志中再次重复出现(正如您对 throw e 所期望的那样)。

我没有记录原因是什么 - 日志中的前一行显示查询的执行。这种情况在 4 天内只发生了两次,而且似乎没有对系统造成任何伤害。

环境:使用 Java 5 在 Tomcat 下运行的相当繁忙的 Web 服务。

我不是在询问有关调试系统的提示 - 这些错误早已不复存在,甚至可能永远不会再发生。我只是对如何在没有堆栈跟踪的情况下创建任何异常(尤其是 NPE)感到困惑?

已添加

正在使用的记录器是一个 slf4j 驱动的 Logback 实例。我相信 warn 方法是 here .不确定解析为什么 Logback 方法,但我相信 Throwable 参数会得到特殊处理,并且如果有堆栈跟踪附加到 Throwable出现在日志中。

LogBack.xml - 根据要求:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="log.package" value="Package" />
  <property name="log.pattern" value="%date{yyyy/MM/dd HH:mm:ss.SSS} [%X{session}:%X{device}] %level %logger{25} - %msg%n"/> 
  <property name="log.consolePattern" value="%highlight(%-5level) %white(%logger{25}) - %msg%n"/> 
  <if condition='isDefined("catalina.home")'>
    <then>
      <property name="log.dir" value="${catalina.home}/logs" />
    </then>
    <else>
      <property name="log.dir" value="." />
    </else>
  </if>

  <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>DEBUG</level>
    </filter>
    <encoder>
      <Pattern>${log.consolePattern}</Pattern>
    </encoder>
  </appender>

  <appender name="rolling" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.dir}/${log.package}.log</file>
    <encoder>
      <Pattern>${log.pattern}</Pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.dir}/${log.package}.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 16MB. -->
        <maxFileSize>16MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- Keep no more than 3 months data. -->
      <maxHistory>90</maxHistory>
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>
  </appender>

  <!-- Default logging levels. -->
  <root level="INFO">
    <appender-ref ref="console"/>
    <appender-ref ref="rolling"/>
  </root>
  <!-- Specific logging levels. -->
  <!-- Generally set to INFO or ERROR but if you need more details, set to DEBUG. -->
  <logger name="org.apache" level="INFO"/>
  <logger name="net.sf.ehcache" level="ERROR"/>
  <logger name="com.zaxxer" level="ERROR"/>
  <logger name="ch.qos" level="ERROR"/>
</configuration>

我手动编辑了日志中 session ID 后面的值以删除客户数据。

最佳答案

有时,尤其是在涉及 NullPointer 时(根据我的经验),jvm 可以优化异常的创建和转换,并且堆栈跟踪会丢失(或者更准确地说,从未创建)。我怀疑您的问题与某些 java 库无关,而是与 jvm 本身有关。

如果你在启动你的 jvm-process 时添加这个参数,你将得到你的堆栈跟踪,如果我的怀疑是正确的话。

-XX:-OmitStackTraceInFastThrow

这个问题之前有人问过,看这里了解更多详情:

注意,这适用于 sun/oracle jvm

关于java - 如何在没有堆栈跟踪的情况下创建/抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843823/

相关文章:

java - 如何判断一个Java集合是否包含 `null`

java - JTabbedPane...如何让每个选项卡在单击时显示其内容?

Android:在扩展 View 中调用父类的方法

java - 什么是NullPointerException,我该如何解决?

java - 尝试将 int 数组的内容复制到 Dimension 数组会导致 NullPointerException

java - NullPointerException 使用链表时出错

java - 使用 Java 正则表达式解析 Drools 规则文件

java - 使用户无法访问网页

java - 使用 GSON 将对象转换为 json 时出现 OutOfMemoryError

java - Android KitKat 传递结果 ResultInfo 失败?