我最近发现了一个导致NullPointerException的错误.使用标准的slf4j语句捕获并记录异常.以下简要代码:
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,没什么特别的.但是,在我们拥有的所有异常日志记录语句中,只有这一个不打印堆栈跟踪.它打印的全部是消息(表示为"...")和异常类的名称(java.lang.NullPointerException).
由于异常上的堆栈跟踪是延迟加载的,我想可能存在某种指令重新排序问题,并决定在日志语句之前调用e.getStackTrace().这没有任何区别.
所以我决定在启用调试代理的情况下重新启动.但是,因为我甚至连接到这个过程,我注意到现在堆栈的痕迹正在打印.很明显,调试代理的存在导致一些额外的调试信息变得可用.
从那时起我就修复了异常的根本原因.但我想了解为什么没有调试器就无法使用堆栈跟踪.谁知道?
澄清:这不是日志记录问题.想象一下相同的try/catch子句,但在catch中,我打印的值为:
e.getStackTrace().length
Run Code Online (Sandbox Code Playgroud)
没有调试器,它打印'0',调试器打印一个正数(在这种情况下为9).
更多信息:这发生在JDK 1.6.0_13,64bit,amd64,linux 2.6.9上
在我的应用程序日志中(使用log4j),我看到一个NullPointerException,但没有堆栈跟踪.我知道,作为一种优化,当多次发生异常时 - jvm会停止产生堆栈跟踪.问题是前一段时间发生的异常,并且所有日志都填充了没有堆栈跟踪的异常.有没有办法"重置"这个机制,所以下一个抛出的异常将打印出完整的堆栈跟踪?我不想重新启动应用程序,因为很难重现这个bug,重启可能会导致"消失"...
谢谢!
这可能是一个非常天真的问题.
我曾经认为a Throwablein Java 总是包含堆栈跟踪.这是对的吗?现在看起来我exceptions 没有堆栈跟踪就抓住了.是否有意义?是否有可能在没有堆栈跟踪的情况下捕获异常?
在我们的日志文件中,我们发现以下内容
[2012-09-24 00:09:32.590 +0000UTC] ERROR host server1 [] [] somepackage.someclass [] [Unknown] [V3rAqPaDvvAAAAExEXhdWGyh] [pjsQwTGHzxcAAAE5j4YdGvWV] "ThreadName" Some error happened: java.lang.ArrayIndexOutOfBoundsException: null
Run Code Online (Sandbox Code Playgroud)
只有这一行,没有异常堆栈跟踪.
try发生此异常的块是执行使用javassist创建的动态生成的Java字节码.
我想知道两件事:
java.lang.ArrayIndexOutOfBoundsException日期nulllogger.error("message", theException)在catch块内部使用日志挂钩调用,这通常会导致在日志文件中打印完整的堆栈跟踪.我的问题:
什么样的代码可以导致日志输出"java.lang.ArrayIndexOutOfBoundsException:null".我尝试用没有运气的测试程序重现这个.我总是得到像"java.lang.ArrayIndexOutOfBoundsException:Index:3"或类似的东西.
丢失堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger/JVM不会"知道"堆栈跟踪或相关的行号吗?
我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉.
今天我正在浏览一些日志并遇到一个奇怪的错误.
以下是它在日志中的显示方式:
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>] ...
Run Code Online (Sandbox Code Playgroud)
这是代码的样子:
} catch (Exception e) {
Ddd.log.warn("Main failure ", e);
throw e;
}
Run Code Online (Sandbox Code Playgroud)
如果重要的话,代码在jsp中.在日志中再次重复相同的异常(正如您所期望的那样throw e).
我没有原因记录 - 日志中的前一行显示了查询的执行情况.这种情况在4天内发生了两次,似乎没有对系统造成任何伤害.
环境:使用Java 5在Tomcat下运行的相当繁忙的Web服务.
我不是在询问有关调试系统的提示 - 这些错误很久以后甚至不会再发生.关于如何在没有堆栈跟踪的情况下创建任何异常(特别是NPE),我感到很难过?
添加
正在使用的记录器是一个slf4j驱动Logback实例.我相信这个warn方法就在这里.不确定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 …Run Code Online (Sandbox Code Playgroud) 更新:Intellij IDEA的最新版本实现了我正在寻找的东西.问题是如何在IDE之外实现这一点(因此我可以将异步堆栈跟踪转储到日志文件中),理想情况下不使用检测代理.
自从我将应用程序从同步模型转换为异步模型后,我遇到了调试失败的问题.
当我使用同步API时,我总是在异常堆栈跟踪中找到我的类,所以我知道从哪里开始查找是否出错.使用异步API,我得到的堆栈跟踪不会引用我的类,也不会指示哪个请求触发了失败.
我将给你一个具体的例子,但我对这类问题的一般解决方案感兴趣.
我使用Jersey发出HTTP请求:
new Client().target("http://test.com/").request().rx().get(JsonNode.class);
Run Code Online (Sandbox Code Playgroud)
where rx()表示请求应异步发生,CompletionStage<JsonNode>而不是JsonNode直接返回.如果此调用失败,我会得到这个堆栈跟踪:
javax.ws.rs.ForbiddenException: HTTP 403 Authentication Failed
at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1083)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:883)
at org.glassfish.jersey.client.JerseyInvocation.lambda$invoke$1(JerseyInvocation.java:767)
at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:414)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:765)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:456)
at org.glassfish.jersey.client.JerseyCompletionStageRxInvoker.lambda$method$1(JerseyCompletionStageRxInvoker.java:70)
at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1590)
Run Code Online (Sandbox Code Playgroud)
注意:
因此,我无法将异常追溯到其来源.
如果你在引擎盖下挖掘,你会发现泽西岛正在调用:
CompletableFuture.supplyAsync(() -> getSyncInvoker().method(name, entity, responseType))
Run Code Online (Sandbox Code Playgroud)
对于rx()调用.因为供应商是由泽西岛建造的,所以没有参考用户代码.
我试图针对一个无关的异步示例提交针对Jetty 的错误报告,随后因安全原因被拒绝.
相反,我一直在添加上下文信息如下:
makeHttpRequest().exceptionally(e ->
{
throw new RuntimeException(e);
});
Run Code Online (Sandbox Code Playgroud)
意思是,我 …
My application logging crashes during maven build in the tests. This is the log4j2.xml what I have in the src/test/resources:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="stdout" target="SYSTEM_OUT">
<PatternLayout pattern="MyApp: %d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %c{1.} - %m%n" />
</Console>
</Appenders>
<Loggers>
<Logger name="com.my.app" level="info" additivity="false">
<Appender-ref ref="stdout"/>
</Logger>
<Root level="error">
<Appender-ref ref="stdout"/>
</Root>
</Loggers>
</Configuration>
Run Code Online (Sandbox Code Playgroud)
And I get this exception during test during build:
2017-11-23 15:12:28,371 main ERROR An exception occurred processing Appender stdout java.lang.NullPointerException
at org.apache.logging.log4j.core.impl.ThrowableProxy.toExtendedStackTrace(ThrowableProxy.java:671)
at org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:138) …Run Code Online (Sandbox Code Playgroud) 我使用Java 8进行项目
我们有一个与此类似的阴性测试:
public Integer g(Object data)
{
try
{
Double d = (Double)data;
}
catch(ClassCastException ex)
{
if( ex.getMessage() == null )
{
return 1;
}
}
return 0;
}
@Test
public void h()
{
Integer count = 0;
for( Integer idx = 0; idx < 100000; idx++ )
{
// The test
count += g(0.7312345f);
}
System.out.println("Total ClassCastException's with null message: "+count);
}
Run Code Online (Sandbox Code Playgroud)
否定测试期望带有消息“ java.lang.Float无法强制转换为java.lang.Double”的异常java.lang.ClassCastException,并且有时会得到空消息
我试图在eclipse中调试它,但是以某种方式将其附加到调试器后,异常和消息始终如预期
我的servlet扔了一个NullPointerException.我想显示完整的堆栈调用跟踪,以便我可以找出引发异常的行号.
我怎样才能做到这一点?我已经习惯了fillInStackTrace().它不打印行号.