相关疑难解决方法(0)

没有调试代理程序,NullPointerException堆栈跟踪不可用

我最近发现了一个导致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上

java logging nullpointerexception stack-trace

58
推荐指数
2
解决办法
3万
查看次数

没有堆栈跟踪的重复异常 - 如何重置?

在我的应用程序日志中(使用log4j),我看到一个NullPointerException,但没有堆栈跟踪.我知道,作为一种优化,当多次发生异常时 - jvm会停止产生堆栈跟踪.问题是前一段时间发生的异常,并且所有日志都填充了没有堆栈跟踪的异常.有没有办法"重置"这个机制,所以下一个抛出的异常将打印出完整的堆栈跟踪?我不想重新启动应用程序,因为很难重现这个bug,重启可能会导致"消失"...

谢谢!

java exception

50
推荐指数
1
解决办法
3万
查看次数

Java中没有堆栈跟踪的异常

这可能是一个非常天真的问题.

我曾经认为a Throwablein Java 总是包含堆栈跟踪.这是对的吗?现在看起来我exceptions 没有堆栈跟踪就抓住了.是否有意义?是否有可能在没有堆栈跟踪的情况下捕获异常?

java exception stack-trace

46
推荐指数
4
解决办法
4万
查看次数

使用NO堆栈跟踪获取"ArrayIndexOutOfBoundsException:null"

在我们的日志文件中,我们发现以下内容

[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字节码.

我想知道两件事:

  1. java.lang.ArrayIndexOutOfBoundsException日期null
  2. 丢失的堆栈跟踪,尽管logger.error("message", theException)catch块内部使用日志挂钩调用,这通常会导致在日志文件中打印完整的堆栈跟踪.

我的问题:

  1. 什么样的代码可以导致日志输出"java.lang.ArrayIndexOutOfBoundsException:null".我尝试用没有运气的测试程序重现这个.我总是得到像"java.lang.ArrayIndexOutOfBoundsException:Index:3"或类似的东西.

  2. 丢失堆栈跟踪的原因可能是此代码是在运行时动态生成的,因此logger/JVM不会"知道"堆栈跟踪或相关的行号吗?

我们目前正在调试和调查以获取更多信息,但也许这听起来很熟悉.

java logging bytecode logback stack-trace

18
推荐指数
2
解决办法
9720
查看次数

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

今天我正在浏览一些日志并遇到一个奇怪的错误.

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

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)

java nullpointerexception

14
推荐指数
1
解决办法
5362
查看次数

如何创建异步堆栈跟踪?

更新: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)

注意:

  • 堆栈跟踪不引用用户代码.
  • 异常消息不包含有关触发错误的HTTP请求的上下文信息(HTTP方法,URI等).

因此,我无法将异常追溯到其来源.

为什么会这样

如果你在引擎盖下挖掘,你会发现泽西岛正在调用:

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)

意思是,我 …

java debugging asynchronous completable-future

9
推荐指数
1
解决办法
846
查看次数

NullpointerException for console appender for Log4j2

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 appender maven consoleappender log4j2

6
推荐指数
1
解决办法
6849
查看次数

带有null消息和原因的java.lang.ClassCastException

我使用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中调试它,但是以某种方式将其附加到调试器后,异常和消息始终如预期

java null message classcastexception

3
推荐指数
2
解决办法
5317
查看次数

从NullPointerException获取堆栈跟踪

我的servlet扔了一个NullPointerException.我想显示完整的堆栈调用跟踪,以便我可以找出引发异常的行号.

我怎样才能做到这一点?我已经习惯了fillInStackTrace().它不打印行号.

java servlets exception

1
推荐指数
1
解决办法
372
查看次数