参考链接: Java条件表达式中的数字类型提升

Map<String, Integer> map = new HashMap<String, Integer>();   map.put("count", null);   Integer it = map == null ? 0 : map.get("count");  注意:在第三行,会抛出java.lang.NullPointerException信息。因为分析:表达式二的类型为int,整个表达式类型为 Integer,JDK5.0会自动打包,所以表达式三 会获得一个Integer,然后转成int,再转成Integer,如果是NULL在转成int的时候抛出空指针异常。

下面的程序将会打印出什么呢?

public class DosEquis{     public static void main(String[] args){     char x = 'X';     int i = 0;     System.out.println(true ? x : 0);     System.out.println(false ? i : x);      }   }   这个程序由两个变量声明和两个print语句构成。第一个print语句计算条件表达式(true ? x : 0)并打印出结果,这个结果是char类型变量x的值’X’。而第二个print语句计算表达式(false ? i : x)并打印出结果,这个结果还是依旧是’X’的x,因此这个程序应该打印XX。      然而,如果你运行该程序,你就会发现它打印出来的是X88。这种行为看起来挺怪的。第一个print语句打印的是X,而第二个打印的却是88。它们的不同行为说明了什么呢?      答案就在规范有关条件表达式部分的一个阴暗的角落里。请注意在这两个表达式中,每一个表达式的第二个和第三个操作数的类型都不相同:x是char类型的, 而0和i都是int类型的。混合类型的计算会引起混乱,而这一点比在条件表达式中比在其它任何地方都表现得更明显。你可能考虑过,这个程序中两个条件表达 式的结果类型是相同的,就像它们的操作数类型是相同的一样,尽管操作数的顺序颠倒了一下,但是实际情况并非如此。      确定条件表达式结果类型的规则过于冗长和复杂,很难完全记住它们,但是其核心就是一下三点: 1、如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。换句话说,你可以通过绕过混合类型的计算来避免×××烦。  2、如果一个操作数的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的常量表达式,它的值是可以用类型T表示的,那么条件表达式的类型就是T。  3、否则,将对操作数类型运用二进制数字提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。      2、3两点是关键。在程序的两个条件表达式中,一个操作数的类型是char,另一个的类型是int。在两个表达式中,int操作数都是0,它可以被表示成 一个char。然而,只有第一个表达式中的int操作数是常量(0),而第二个表达式中的int操作数是变量(i)。因此,第2点被应用到了第一个表达式 上,它返回的类型是char,而第3点被应用到了第二个表达式上,其返回的类型是对int和char运用了二进制数字提升之后的类型,即int。      条件表达式的类型将确定哪一个重载的print方法将被调用。对第一个表达式来说,print(char)将被调用,而对第二个表达式来 说,PrintStream.print(int)将被调用。前一个重载方法将变量x的值作为Unicode字符(X)来打印,而后一个重载方法将其作为 一个十进制整数(88)来打印。      总之,通常最好是在条件表达式中使用类型相同的第二和第三操作数。否则,你和你的程序的读者必须要彻底理解这些表达式行为的复杂规范。      对 语言设计者来说,也许可以设计一个牺牲掉了部分灵活性,但是增加了简洁性的条件操作符。例如,要求第二和第三操作数必须就有相同的类型,这看起来就很合 理。或者,条件操作符可以被定义为对常量没有任何特殊处理。为了让这些选择对程序员来说更加容易接受,可以提供用来表示所有原始类型字面常量的语法。这也 许确实是一个好注意,因为它增加了语言的一致性和完备性,同时又减少了对转型需求。

转载于:https://blog.51cto.com/3470969/1126884

[转载] JAVA条件表达式的陷阱相关推荐

  1. JAVA条件表达式的陷阱

    Map<String, Integer> map = new HashMap<String, Integer>();  map.put("count", n ...

  2. java 条件表达式_Java 三目运算符

    对于有些选择分支结构,可以使用简单的条件运算符来代替.如: 引用 if(a min=a; else min=b; 可以用下面的条件运算符来处理 min=(a 其中"(a 条件运算符由两个符号 ...

  3. 单行 - JAVA 条件表达式

    public class ExpressionUse{//It's the main() function.//每个应用程序都应该有一个main()函数体.public static void mai ...

  4. java条件运算符类型转换_Java运算符,条件表达式,类型转换

    运算符 首页要知道计算机最基本的功能就是执行数学运算,那Java中有那些现实中的加,减,乘,除呢 算术运算符 假设A=10,B=5 + 加法 A+B=15 - 减法 A-B=5 乘法,不像现实中的x, ...

  5. 在Java语言的if语句是什么表达式,if语句中的条件表达式中只能使用

    if语句中的条件表达式中只能使用关系或逻辑表达式吗?别的人十句话都不会伤到小编,但你的一句话就可以把小编伤得撕心裂肺. 不是,可以用任意表达式. if语句是指编程语言(包括c语言,C#,,java,V ...

  6. java基础:条件表达式

    条件表达式:x=<表达式1>?<表达式2>:<表达式3> 其意义是:先求解表达式1,若为非0(真),则求解表达式2,将表达式2的值赋给x.若为0(假),则求解表达式 ...

  7. 三元表达式java_记录一个Java三元表达式中的陷阱

    今天遇到一个奇怪的Java三元表达式中的空指针异常.特此记录. 代码 代码示意如下: Integer itemVO = null; Integer globleLatenessToleranceUse ...

  8. java odata filter_用antlr解析odata filter条件表达式

    这篇文章分享如何用antlr解析odata filter条件表达式. 我最早接触antlr,是在刚开始工作后不久,那次需要用antlr实现一个功能:把gemfire的OQL(object query ...

  9. 【C语言探索之旅】 第一部分第六课:条件表达式

    内容简介 1.课程大纲 2.第一部分第六课:条件表达式 3.第一部分第七课预告:循环语句 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

最新文章

  1. python测试代理IP地址
  2. linux 内核钩子 khook 项目介绍
  3. 使用 Microsoft .NET Framework 精简版中的 MessageWindow 类
  4. python基础语法第10关作业-Python基础作业一
  5. Warensoft Unity3D通信库使用向导4-SQL SERVER访问组件使用说明
  6. 算法的优缺点_一文总结机器学习各算法优缺点
  7. C# GridView 分页显示
  8. php 正则断言里面使用*+
  9. 如何用hover实现下拉菜单
  10. EMD 加 时频分析
  11. PR:设置关键帧、调出效果搜索栏找到裁剪效果
  12. 同步软件UltraCompare 64位 软件及注册机
  13. 中国石油行业并购重组趋势与投资战略规划建议报告2022~2028年
  14. 休闲娱乐 - 减肥餐
  15. python爬虫实战-网易BUFF CSGO饰品
  16. 歪解单片机的时钟系统--关于内外时钟切换及时钟超频测试
  17. AI切片工具是如何使用的
  18. 关于selenium调用firefox浏览器的调试
  19. 入驻华为云·云享专家了~
  20. 数据结构课程设计之项目三---算术表达式求解

热门文章

  1. Win7系统转到Win10系统的装机方法
  2. 4am永远 鼠标按键设置_4AM称霸PCL和PEL 绝地求生与和平精英的双端冠军 | 电玩巴士...
  3. duino例程 stm32_stm32duino
  4. linux下进程监控6,Linux进程监控技术—精通软件性能测试与LoadRunner最佳实战(6)...
  5. python句柄无效_subprocess.Popen 运行windows命令出现“句柄无效”报错的解决方法
  6. Oracle GoldenGate复制过程
  7. ubuntu安装字符集
  8. ubuntu7.10 apache+php+mysql配置
  9. X86和X86_64和AMD64的由来
  10. C#浅拷贝与深拷贝区别