BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #52261同步于 2016/8/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[已解决]为什么以int为返回值方法返回null能过编译?

ytinrete
2016/8/9镜像同步28 回复
小白球轻喷 当然直接return显然是不行的,但是这样写却可以: ```Java int test() { return true ? null : 0; } ``` 当然直接运行起来会报异常 java.lang.NullPointerException 但是这样写就过不了编译 ```Java return true ? null : null; ``` 我感觉有点奇怪唉,我一直认为int这种基本类型的方法签名只要能过编译一定能返回一个整数无论如何 看到这种东西简直一脸懵逼 所以说为什么会这样呢?明明是我先,唉,不对。。 首先这个应该不是锅,感觉要么是三元表达式处理的比较特殊,要么是跟Integer的装箱拆箱有关 下面是一些实验: 以下这些不能过编译 ```Java return true ? new String() : new String(); return true ? 0 : new String(); return true ? new String() : new Integer(0); ``` 以下这些可以过编译 ```Java return true ? new Integer(0) : 0; return true ? null : new Integer(0); return true ? new Integer(0) : new Integer(0); ``` 好像返回结果只要有一个是int或Integer或null而且不能有两个null? lz还是一脸懵逼中 如果对于boolean,double之类的呢? 这么偏门的知识有人了解过么?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2016/8/9
忍不住又去读java language spec了。 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 首先,这个三目表达式:“true ? null : 0”: 1. 由于第二和第三个参数中,有一个是null,它不是基本类型,所以整个表达式是个“引用类型的三目表达式”。 2. 由于第二个参数是对象类型(确切地说是null type),第三个参数是int,根据spec里的表格,整个表达式的类型是null和Integer的least upper bound,就是Integer(就是这么规定的) 3. 所以,从0到整个三目表达式发生了一次“装箱”,从三目表达式到返回值又发生了一次拆箱。 但是我猜这个程序运行时会抛出null指针异常。因为试图把Integer型的null拆箱。 不过,个人觉得这样写没什么意思。区分装箱和非装箱的整数类型是Java的一大败笔。还是Scala好,只有Int。而“if(true) null else 0”是编译错误
nuanyangyang机器人#2 · 2016/8/9
然后,true?null:null的话,根据规则,整个表达式是null类型。对于null类型,java规范只规定了它可以赋值或者转换成reference类型,但函数返回值是int类型。所以……
wht机器人#3 · 2016/8/9
头像啊头像点赞 【 在 nuanyangyang (暖羊羊) 的大作中提到: 】 : 然后,true?null:null的话,根据规则,整个表达式是null类型。对于null类型,java规范只规定了它可以赋值或者转换成reference类型,但函数返回值是int类型。所以…… : [upload=1][/upload]
maoxian机器人#4 · 2016/8/9
打死白学家
ytinrete机器人#5 · 2016/8/9
【 在 nuanyangyang 的大作中提到: 】 : 忍不住又去读java language spec了。 : https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 : 首先,这个三目表达式:“true ? null : 0”: : ................... 原来jls里面说的这么清楚啊,我没有去查就先伸手这的确不太好/w\ 感谢暖神科普★
ytinrete机器人#6 · 2016/8/9
【 在 nuanyangyang 的大作中提到: 】 : 然后,true?null:null的话,根据规则,整个表达式是null类型。对于null类型,java规范只规定了它可以赋值或者转换成reference类型,但函数返回值是int类型。所以…… : [upload=1][/upload] 头像换了差点认不出来了呢,好评。 但为什么是Pony?23333333333 小马简直精神污染!
ytinrete机器人#7 · 2016/8/9
【 在 maoxian 的大作中提到: 】 : 打死白学家 七夕就姑且放过我吧w
dss886机器人#8 · 2016/8/9
卧槽,暖神我觉得还是你以前的头像好看点 【 在 nuanyangyang 的大作中提到: 】 : 忍不住又去读java language spec了。 : : https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25
nuanyangyang机器人#9 · 2016/8/9
【 在 ytinrete 的大作中提到: 】 : : 头像换了差点认不出来了呢,好评。 : 但为什么是Pony?23333333333 : ................... 捕获brony一只。明明是人形。除非是brony否则不会知道这个和小马有关的。