java - 三元表达式可以产生空布尔值而没有编译器错误?
问题描述
给定以下代码:
boolean c = true;
boolean d = true;
boolean b = c ? null : d;
System.out.println(b);
为什么编译器不在这里抱怨?变量 b 是原始数据类型,null 不应该产生类似“类型不匹配:无法从 null 转换为布尔值”之类的错误消息吗?
我最好的猜测是,有一些自动装箱正在进行吗?我在一个项目中看到了这段代码,但我很想知道这背后的确切原因......
EDIT1:如下面的 Mena 所述,此代码在运行时生成 NullPointer
编辑 2:以下表格也可以正确编译:
boolean c = false;
boolean d = true;
boolean b = c ? null : d;
System.out.println(b);
编辑 3:尝试使用编译器级别 1.4 进行编译时,这不会编译,但会产生错误:
Incompatible conditional operand types null and boolean.
那么自动装箱是否有意义,因为它是在 1.5 中引入的?
解决方案
RHS 上的表达式是类型的Boolean
,将在运行时自动拆箱;编译时类型检查不会受到影响。拆箱将导致运行时异常。
推荐阅读
- mongodb - 无法在流星中创建文档集合
- python-3.x - ModuleNotFoundError:没有名为“Python3”的模块
- node.js - 我错误地点击了 cmd,npm install 在已经创建的应用程序中,而不是 npm start。会不会有什么问题?我可以无忧无虑地前进吗?
- javascript - 即使在对键进行迭代时,从数组对象中删除值也会修改整个对象
- java - 如何停止从 TextWriter 中截断尾随 0?
- c# - 如果是 google drive v3,如何获取 v2 About.LargestChangeId?
- c# - 如何在 C# 中删除 TableView 中的行时从右到左单元格设置动画
- r - 尝试读取 CSV 文件
- excel - 由于这条线,Vba 没有运行所有线
- mybatis - where 标签在只有第一个生效的地方