Raf*_*l T 12 java null ternary-operator raw-types
我一直以为Java中的原始类型不可能null,因为如果我尝试这样做,这是一个编译时错误:
int test = null;
Run Code Online (Sandbox Code Playgroud)
但是在三元操作中,似乎允许:
int test = something != 0 ? 5 : null;
Run Code Online (Sandbox Code Playgroud)
不是三元操作(在这种情况下):
int test;
if (something != 0){
test = 5;
} else {
test = null
}
Run Code Online (Sandbox Code Playgroud)
这当然不应该被允许.如果该条件失败,它将自动抛出一个NullPointerException由于自动装箱.那么为什么java编译器不会像这样获取废话呢?
Jes*_*per 13
会发生什么是Java编译器首先尝试在:相等的两侧创建表达式的类型.在这种情况下,它自动装箱5到Integer; 请注意,这null是一个有效值Integer.整个三元表达的结果是Integer.您将其分配给a int,Integer然后自动装箱.
本质上,编译器应用autoboxing和-unboxing,以便该行看起来像这样:
int test = (something != 0 ? Integer.valueOf(5) : null).intValue();
Run Code Online (Sandbox Code Playgroud)
实际上,自动装箱null导致了NullPointerException.
那么为什么java编译器不会像这样获取废话呢?
因为Java语言的设计者以这样的方式定义了语言,所以它并没有决定这必须被视为错误......
Java语言规范的第15.25节解释了如何确定整个表达式的类型.
| 归档时间: |
|
| 查看次数: |
983 次 |
| 最近记录: |