Java 服务端架构
Spring、Netty、日志框架与工程化实战
🎨 视觉封面一个容易忽略的Java空指针问题
今天有人提出了代码中一个的NullPointException问题。这类问题,很好解决,找到所在行,一看便知。
但是这次,有点意外。抛异常的行,只是一个简单的Pojo的get、set方法。出错的行在
a.setSize(b.getSize());
很自然的想到b会为null。但是前面的代码已经用过b了,也就是说,如果b是null。早就抛出空指针了。a是新new的。不会是null。se****t方法内部也只是赋值。
this.size = size
一时间,我迷惑了。再仔细看代码,发现b**.getSize获取的类型是Long**。而a.setSize,传入的类型是long。
这种包装类到基本类型的转换,是会导致空指针的发生的。到此,bug是定位了。但是,你不想知道为什么这种强转会抛空指针吗?首先,应该想到的是,通俗的说,NullPointException的一般情况,就是用null对象调用方法。那么自然联想到,这里究竟是调用了什么方法?很简单,看编译过的字节码便知:
1 astore_1 [l]
2 aload_1 [l]
3 invokevirtual java.lang.Long.longValue() : long [16]
6 lstore_2 [m]
原来这种强转是调用了Long中的**longValue()**方法。自然符合用null对象调用方法,抛出空指针异常,也就不奇怪了。
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
猜你想读 · 相关文章推荐
Java文件读取 jar包内文件读取
最近遇到一些Jar包内外配置文件读取的问题。索性自己测试总结一下,与大家分享。 主要是关于ClassLoader.getResource和Class.getResource方法路径区别的问题。
未初始化的String相 "+" 为什么会打印出“nullnull"
今天在我的一个qq群里有人问了这样一个问题。 输出是nullnull。问为什么是这样。 其实问题并不复杂,很多同学也觉得自己知道原因,遂不予关注。但是我相信还是有初学Java的同学在这里是存在误会的。很典型的误会就是如一个群里的朋友说的String类型的变量如果没有显示初始化,默认的值就是"null"。支持的理由就是...
白话Java - 守护线程
关于"白话", 偶然想到的词。目的就是用简洁,明快的语言来告诉您,我所知道的一切。 Java中的线程分两类,用户线程和守护线程。 这样就是用户线程。 这样就是守护线程。 起了"守护"线程这么动听的名字,自然要起到"守护"的作用。就好比男人要守护妹子。守护线程的作用,按照网上的说法是: 守护线程则是用来服务用户线程的,如...
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com