文章

一个容易忽略的Java空指针问题

今天有人提出了代码中一个的NullPointException问题。这类问题,很好解决,找到所在行,一看便知。

但是这次,有点意外。抛异常的行,只是一个简单的Pojogetset方法。出错的行在

1
a.setSize(b.getSize());

很自然的想到b会为null。但是前面的代码已经用过b了,也就是说,如果bnull。早就抛出空指针了。a是新new的。不会是null。se**t方法内部也只是赋值。

1
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:https://github.com/lihongzheshuai/yummy-code

GESP 学习专题站:GESP WIKI

"luogu-"系列题目可在洛谷题库进行在线评测。

"bcqm-"系列题目可在编程启蒙题库进行在线评测。

欢迎加入Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答

欢迎加入C++ GESP/CSP认证学习QQ频道,考试资源总结汇总

欢迎加入C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权