`
MauerSu
  • 浏览: 513477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

NullPointerException丢失异常堆栈信息

    博客分类:
  • J2EE
 
阅读更多
源:http://blog.csdn.net/taotao4/article/details/43918131
评:
在生产环境上看到tomcat/log/catalina.out一直输出异常信息,但是不见异常堆栈信息。
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException


在使用log4j中,调用异常方法exception.getStackTrace()获取到异常堆栈信息数组StackTraceElement[],然后使用方法log.error(String msg)来循环打印StackTraceElement。(这种做法是不是很诡异-_-)。没发现任何与异常相关的信息打印出来。


java的标准输出在tomcat启动时,被管道重定向到了catalina.out,catalina.out信息来自所有标准输出。我们在catalina.out看到了信息,说明异常出现时,调用了标准输出,但是没有任何异常堆栈信息出来;我们在log4j配置的文件中没有找到任何异常信息说明StackTraceElement[]中没有任何信息。

最开始怀疑是log4j的使用方式有问题,导致打印不出来,但是当前的使用方式只会丢失rootCause,不会丢弃所有的异常堆栈。catalina.out中就以为是使用了标准输出打印异常类名...。事实当然不是这样,后来查看了异常处理点,基本上都会调用printStackTrace(),然后调用log4j来输出异常到其他文件。说明异常的堆栈信息确实丢失了。

异常堆栈丢失了,然后google之,stackoverflow答案。从别人的回答中,可以看到,这里可能是jvm优化时,产生的结果。具体参考文章
这里自己写的代码,在接近执行两万次时,确实看到异常堆栈信息就没有了:
[java] view plain copy
  
public static void main(String[] args) {  
    int i = 0; 
    String x= null; 
    while (i < 100000000) { 
        try { 
            System.out.println("当前执行次数为:"+i); 
            getNPE(x); 
        } catch (Exception e) { 
            int lth = e.getStackTrace().length; 
        System.out.println("length:"+lth); 
            e.printStackTrace(); 
            if(lth==0){ 
            return; 
        } 
        } 
        i++; 
    } 
     
 
}  
 
private static void getNPE(String x){ 
    System.out.println("当前字母为:"+x.toString()); 

测试时java版本信息:
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
当增加虚拟机参数-XX:-OmitStackTraceInFastThrow后,执行了100w次以上,也不见异常堆栈信息丢失。
看看oracle的官方解释:
The compiler in the server VM now provides correct stack backtraces for all "cold" built-in exceptions. For performance purposes, when such an exception is thrown a few times, the method may be recompiled. After recompilation, the compiler may choose a faster tactic using preallocated exceptions that do not provide a stack trace. To disable completely the use of preallocated exceptions, use this new flag: -XX:-OmitStackTraceInFastThrow.
这里的"cold",个人以为是与hotspot VM中hot相对的意思,意思是非热点内置异常。如果异常被抛出数次,就变成”hot“了,这时就会丢失异常信息,因为这时的异常是预先分配的。
在查找资料的时候,发现淘宝定制的vm对这个功能有个开关,可以动态切换是否禁用此项优化。
参考链接:http://www.oracle.com/technetwork/java/javase/relnotes-139183.html
分享到:
评论

相关推荐

    Java异常框架设计

    - **避免在finally块中抛出异常**:这可能导致原始异常被覆盖,丢失重要信息。 - **不要滥用异常**:异常不应用于正常的控制流程,而应保留为异常情况的信号。 9. **日志和追踪**:在异常处理中,记录异常信息是...

    高效的java异常处理

    5. 为异常提供有意义的错误信息,使用构造函数传入异常描述和堆栈跟踪,以便于调试。 6. 使用try-with-resources语句处理需要关闭的资源,如文件流,以确保资源在完成使用后得到及时关闭,即使出现异常。 7. 考虑...

    通过半年的实习经历.doc

    使用如log4j或java.util.logging等日志框架,可以记录异常堆栈跟踪,便于后期分析和调试。 6. **避免过度捕获**:尽量只捕获你能够处理的异常,避免使用过于宽泛的catch块,如`catch (Exception e)`,这可能导致...

    03-Java异常面试题目

    8. 不要记录并抛出异常,避免异常信息的丢失。 9. 封装异常时保留原始异常,便于追踪问题。 10. 避免使用异常来控制程序流程,异常应主要用于异常情况。 11. 使用标准的异常类,如`IllegalArgumentException`、`...

    Java基础入门自学课件 第13章 异常处理(共24页).rar

    当一个异常发生时,Java会生成一个异常对象,这个对象包含了关于异常的详细信息,如异常类型和堆栈跟踪。如果当前方法没有捕获该异常,它会被传递到调用该方法的上一级方法,直到找到合适的catch块来处理,或者如果...

    Java编程技术课件:07异常(2学时).pptx

    如果没有适当的处理,程序会终止,并打印出异常的堆栈跟踪信息。 7.2 异常处理 Java提供了异常处理的五种关键字:try、catch、finally、throw和throws。 - try块:用于包含可能会抛出异常的代码。如果在try块中...

    Java异常处理的最佳实践

    捕获顶层的Exception或Throwable,虽然能确保所有异常都被处理,但这会使异常处理变得过于泛化,导致丢失具体异常信息,从而难以确定问题的真正原因。因此,建议尽可能捕获更具体的异常类型,以便更精确地应对异常...

    Java异常处理的12条军规总结

    4. **避免吞没异常**:在`catch`块中不要简单地忽略异常,这会导致错误信息丢失,使得问题难以诊断。正确做法是记录异常并决定是否需要重新抛出。 5. **精确异常处理**:避免使用`Exception`作为捕获异常的类型,而...

    解决太阳神版eclispe生产wsdl空指针的问题

    错误堆栈显示了问题发生在ContentCopyUtils类中的makeFolderPathAtLocation方法,这通常意味着在尝试创建或复制文件夹到工作区时遇到了未初始化的对象引用。 **解决步骤:** 1. **检查工作目录:** 首先,你需要...

    java所有运行时异常以及错误.doc

    ##### 2.2 空指针异常类:`NullPointerException` - **简介**:尝试访问或操作一个 `null` 引用时抛出。 - **常见场景**:访问 `null` 对象的属性或调用其方法。 ##### 2.3 类型强制转换异常:`ClassCastException`...

    解决MyEclipse10.7部署报错抛空指针异常问题的方法

    在使用MyEclipse 10.7.0版本时,用户可能会遇到一个常见的问题,即在尝试部署应用程序时遭遇空指针异常(NullPointerException)。这个问题主要表现为在MyEclipse的Servers视图中无法正常打开,导致报错日志记录了一...

    个人笔记--JAVA基础

    Java API文档是Java开发者的重要资源,提供了所有Java标准库的详细说明,包括类、接口、枚举和异常等的使用方法。 **1.7. 集成开发工具** - **1.7.1. 常用的集成开发工具** - Eclipse - IntelliJ IDEA - ...

Global site tag (gtag.js) - Google Analytics