NullPointerException 没有堆栈
周五在公司搭好的ELK上查看日志,组长让看看其中NullPointerException出现很多的原因。
通过NullPointerException搜索,点看其中一个查看,发现异常的信息就一行java.lang.NullPointerException,并没有堆栈信息。
看了几个都没有,然后翻代码看记日志的地方,调用了日志基础工程的一个方法,异常对象通过封装传了进去,其中异常信息属性取值用的是Throwables.getStackTraceAsString(e),这是guava包提供的方法,点进去看是取了所有堆栈信息的。
那么问题来了,为什么堆栈信息没显示出来呢?
百度了下,关键字:NullPointerException 没有堆栈
找到类似的问题,发现是JVM虚拟机对异常信息进行了优化,当相同异常出现很多次,会认为它是热点异常,忽略掉异常堆栈信息;通过增加JVM参数:-XX:-OmitStackTraceInFastThrow可解决。
而项目工程里那个异常,产生来源是一个storm计算过程,它每天会进行很多次,因此很可能就是这个原因。
于是修改storm启动脚本,增加此JVM参数:-XX:-OmitStackTraceInFastThrow。重新提交topology到storm,很快能查看到最新的NullPointerException日志,看异常堆栈信息已完整输出,能够定位到具体代码行了。
本机写了个简单程序测试,循环很多次调用产生NullPointerException的方法,只打印最后一次异常:
package com.cdfive.learn.guava; import com.google.common.base.Throwables; /**
* 堆栈信息丢失测试
* -XX:-OmitStackTraceInFastThrow
* @author five
* @date 2018-05-27
*/
public class ThrowablesTest {
public static void main(String[] args) {
int max = 100;
// int max = 10000;// jvm参数增加-XX:-OmitStackTraceInFastThrow,否则只输出java.lang.NullPointerException,没有堆栈信息
for (int i = 1; i <= max; i++) {
try {
npeMethod();
} catch (NullPointerException e) {
if (i == max) {
System.out.println(Throwables.getStackTraceAsString(e));
}
}
}
} public static void npeMethod() {
String s = null;
s = s.substring(0);
}
}
当max=100时,数量较少,能输出完整的异常堆栈:
java.lang.NullPointerException
at com.cdfive.learn.guava.ThrowablesTest.npeMethod(ThrowablesTest.java:28)
at com.cdfive.learn.guava.ThrowablesTest.main(ThrowablesTest.java:17)
当 max=10000时,输出结果中堆栈丢失了:
java.lang.NullPointerException
在JVM启动参数中增加:-XX:-OmitStackTraceInFastThrow后,又能够输出完整的异常堆栈了。
-----------------------------------------------------------------------------------------------------------------------------------
参考:
JVM参数分享 OmitStackTraceInFastThrow https://www.jianshu.com/p/e87d166380eb
https://blog.csdn.net/shfqbluestone/article/details/70978852
https://blog.csdn.net/taotao4/article/details/43918131
NullPointerException 没有堆栈的更多相关文章
- JVM参数OmitStackTraceInFastThrow:不打印NullPointerException异常堆栈
查看线上日志,遇到一个诡异的问题,就是系统大量空指针的异常,但是没有打印堆栈,导致不方便定位问题. 经过一番代码调试,确定并非程序代码问题.没有线索之后,从Google找到了答案:是因为在server ...
- 【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsException、ArrayStoreException、ArithmeticException等没有异常堆栈信息
今天工作中,临时Fix一个bug,一看日志“java.lang.ClassCastException: null”相当懵逼,没有详细堆栈信息,这咋整.虽然根据上下文可以推测代码的大致位置,但不敢拍板确 ...
- Android:如何从堆栈中还原ProGuard混淆后的代码
本文翻译自Android: How To Decode ProGuard's Obfuscated Code From Stack Trace 本篇文章是写给那些在他们的应用中使用ProGuard并且 ...
- 几个简单的例子让你读懂什么是JAVA的堆栈跟踪
简单的来说,堆栈跟踪就是我们的程序在抛出异常时使用的方法调用列表. 简单的例子 通过问题中给出的示例,我们可以准确地确定应用程序中抛出异常的位置. 我们来看看堆栈跟踪: Exception in ...
- log4j打印堆栈信息
原文地址:https://blog.csdn.net/xianyu_0418/article/details/6043174 大家都知道,网站在运行的过程中,打印必要的log对记录网站的运行情况.从而 ...
- 异常 Exception 堆栈跟踪 异常捕获 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- java.lang.NullPointerException - 如何处理空指针异常
当应用程序试图null在需要对象的情况下使用时抛出.这些包括: 调用null对象的实例方法. 访问或修改null对象的字段. 把长度null当作一个数组. 像访问或修改null阵列一样访问或修改插槽. ...
- [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)
可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...
- NullPointerException异常的原因及java异常??
所谓空指针异常,是因为用空(null)去调用属性或方法. null表示没有这个对象,既然没有这个对象,那么去调用他的属性和方法,就会报异常. <--主要有以下几种原因: 1.使用了未 ...
随机推荐
- XSS防御和绕过2
上一篇已经总结过,这里转载一篇,备忘 0x01 常规插入及其绕过 转自https://blog.csdn.net/qq_29277155/article/details/51320064 1 Scri ...
- Docker镜像构建文件Dockerfile及相关命令介绍
使用docker build命令或使用Docker Hub的自动构建功能构建Docker镜像时,都需要一个Dockerfile文件.Dockerfile文件是一个由一系列构建指令组成的文本文件,doc ...
- Spring特点与工作原理
根据多个参考资料,总结如下: Spring的概念 Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系.它是一种容器框架,用于创建bean,维护bean之间 ...
- postman安装时提示打不开
安装postman6.6.1时,提示打不开,如下图: 解决办法: 1.找到以下两个路径直接删除文件,注安装路径不同有可能不同 C:\Users\Administrator\AppData\Roamin ...
- xtrabackup备份恢复过程
备份 1.全备 innobackupex --user=root --password=123456 --no-timestamp /backup/full 增加数据 mysql> insert ...
- Delphi 通过ADO连接数据库
- CPU排行
早期的时候,在某个网站上面收录下来的关于CPU排行的信息,发出来让更多的人看到,希望能够帮助到一些人!
- 适配器 1、ArrayAdapter 2.SimpleAdapter
1.ArrayAdapter(数组适配器):用于绑定格式单一的数据.数据源:可以是集合或数组 public class MainActivity extends AppCompatActivity { ...
- altium designer 鼠线
第一: 按“L”进入View Configurations 要确保Default Color for New Nets是勾上的. 第二: 如果“PCB”的下拉列表处于“From-To Editor”状 ...
- libusb传输endpoint描述符
至于endpoint描述符,它是属于设置的,每个设置都会有endpoint描述符,也就是每个接口的设置都表示一种功能,既然是实现了功能,那就必须通过endpoint来传输数据,那到底是用到了几个end ...