scala.Int.unbox(null)返回0,直接调用对应代码却抛空指针的疑问
为什么调用scala.Int.unbox(null)返回0,直接调用null.asInstanceOf[java.lang.Integer].intValue()却抛NPE?
哈哈,这个问题问得特别到位!你没看错那行实现代码,但确实忽略了Scala编译器对scala.Int.unbox方法的特殊“内置处理”😉
这里的核心细节是:
- 你看到的
scala.Int.unbox的源码实现def unbox(x: java.lang.Object): Int = x.asInstanceOf[java.lang.Integer].intValue(),其实只是Scala源码里的逻辑描述,不是运行时真正执行的代码。Scala编译器对这个方法有专门的内置优化逻辑。 - 当编译器检测到你调用
scala.Int.unbox(x)时,会自动生成带空值判断的字节码:如果参数x是null,直接返回0;只有当x非空时,才会执行类型转换和拆箱操作。这是Scala为了平滑处理Java装箱类型与Scala原生数值类型之间的转换,特意做的容错设计。 - 而你直接写
null.asInstanceOf[java.lang.Integer].intValue()时,编译器不会触发这个特殊处理,完全遵循Java的语义执行:null强制转换为Integer后依然是null,调用其方法自然就抛出NullPointerException了。
如果你好奇的话,可以反编译调用scala.Int.unbox(null)的字节码,会清晰看到里面有ifnull的分支判断,直接返回0,根本不会走到原源码里的拆箱逻辑。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

