@
yibo2018 #20 a 是 Long 的时候,a > 0 在编译时会被转换为 a.longValue > 0 (实际情况可能只是编译后等效而不是先转换再编译,但可以先这么认为)。原本 null > 0 ,或者对量变量 obj > 0 ,都是编译错误,8 个封装类型是加了语法糖,才能这么写。
知道以上情况,会更容易定位到 NullPointerException “> 0” 没有关系,抛出它的地方是 a.longValue 的时候 a 是 null 。这只是一个很普通但很难处理的 NPE 问题。对于你这种从别的地方接过来的变量(不是你能控制的变量)来说,你只能判断它给你的是不是 null ,但不能控制它不给你 null ,所以是铁定要做 null 判断的。
如果你只是需要代码更好写 /看,而不是避开 null 判断,那还是有办法的。可以写成这样,if ( requestNonNullOrDefult(a, -1) > 0) 。requestNonNullOrDefult 就需要你自己提供,或者找第三方工具包了,JDK 是没有的。JDK 8 以后用了另一种套路来解决 NPE 问题,它要求方法返回一定不会是 null 的对象,要么是确实不会是 null 的对象,要么是可能为 empty 的 Optiona<T> 对象。