`
mingyang2013
  • 浏览: 5098 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java条件运算符,三目运算符:类型转换导致的错误

阅读更多
【本博原创文章】


今天在调试代码时,发现这样一个错误,感觉挺有意思,跟想象中的结果不太一样。拿出来大家看看,大家是否一时也未发现错误原因?

代码1:
String flag = "XXX";
Boolean expected = "false".equals(flag) ? false :("true".equals(flag) ? true : null);
代码1 会抛个NullPointerException。

代码2:
String flag = "XXX";
Boolean expected = "false".equals(flag) ? Boolean.FALSE :("true".equals(flag) ? Boolean.TRUE : null);
代码2 则正常执行。

代码3:
Boolean c = null;
boolean b = c;
代码3运行会报个NullPointerException,据此得出一个基本事实,给基本布尔类型变量赋null值,是会抛空指针异常的。

仍有疑惑的朋友,请往下看:

条件表达式基本格式为:  逻辑运算表达式?表达式1:表达式2;
    “逻辑运算表达式”返回一个布尔值,即true 或 false, 然后根据布尔值,返回表达式1或表达式2的值,在表达式1和表达式2计算值的过程中,有类型转换的过程,即,如果表达式1的类型是Boolean,表达式2类型是boolean,表达式2的值可以被转成Boolean。
    为方便讲解,将代码1的条件运算语句表示为Boolean expected = A ? B : (C ? D : E);代码1运算过程是这样的,先计算A值,如果A是true, 则计算并返回B值;如果A是false,则计算返回(C ? D : E)值。代码1因为A是false,所以会去计算(C ? D : E)的值,因为B是boolean,所以(C ? D : E)的值也应该返回boolean值,这儿可以看作将(C ? D : E)返回值存放于一个boolean的临时变量x里,因为返回的是null,将null赋给boolean临时变量x,所以就NullPointerException异常了。
    好了,分析了代码1,那么代码2为什么是正确的,相信就不难理解了。

以上问题主要分析了java条件表达式的详细运算过程以及其中的表达式类型转换,从而,加深了对一些基本知识的理解,避免犯一些看似低级的错误。

结束了,针对此问题,粘上一些相关代码,供参考:
代码4:
String flag = "XXX";
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)
				: false;

代码4抛空指针异常。

代码5:
String flag = "XXX";
Boolean expected = "XXX".equals(flag) ? ("true".equals(flag) ? true : null)
				: Boolean.FALSE;
		System.out.print(expected);

代码5正常执行,打印出null。
分享到:
评论

相关推荐

    Java 三目运算符

    在Java编程语言中,三目运算符(也称为条件运算符)是一种简洁且高效的方式来根据条件选择两个可能的值中的一个。它由三个操作数组成,因此得名“三目”运算符。 #### 二、语法结构 三目运算符的语法结构为: ``` ...

    java运算符小程序

    :`,也称为三目运算符,提供了一种简洁的方式进行条件赋值。例如,`int max = (a > b) ? a : b;`会将较大的值赋给`max`。 7. **复合赋值运算符**:像`+=`, `-=`等,它们结合了运算和赋值。例如,`x += y`等同于`x ...

    Java运算符+(优先级、目数)+.doc

    , :)** 三目运算符,根据条件选择返回一个值。 23. **赋值运算符 (=) 和混合赋值运算符 (+=, -=, *=, /=, %=, &=, |=, ^=, , >>=, >>>=):** 赋值运算符用于将值赋给变量,混合赋值运算符同时进行运算和赋值。 注意...

    java代码-加深三目运算符练习。

    Java中的三目运算符,也称为条件运算符,是编程语言中的一种简洁的表达方式,用于根据条件返回一个值。这个运算符在Java中经常被用到,特别是在简化代码和提高可读性方面。本练习旨在帮助你深入理解和熟练运用Java的...

    Java中条件运算符.pdf

    Java中的条件运算符,也被称为三目运算符,是一种简洁的语法结构,用于根据特定条件来选择执行不同的表达式。这种运算符的格式是:`条件 ? 结果1 : 结果2`。如果条件为真(`true`),则执行结果1;如果条件为假(`...

    Java程序设计课件:第二章 运算符和语句.ppt

    8. **三目条件运算符**:`? :` 提供了一种简洁的条件表达式方式。当一个布尔表达式`x`为真时,返回`y`的值,否则返回`z`的值。例如,`score 不及格" : "及格"`。 9. **语句概述**:包括条件语句如`if...else`和`...

    Java基础知识梳理

    * 三元运算符(三目运算符):x?y:z。 九、流程控制 * 顺序结构。 * 选择结构:if 语句、switch 语句、case 语句。 * 循环结构:for 语句、while 语句、do-while 语句。 十、类型转换 * 小的可以直接赋给大的。 ...

    java运算符优先级表

    Java运算符是编程语言中用于执行特定操作的符号,它们在程序中扮演着至关重要的角色。理解运算符的优先级对于编写清晰、准确的代码至关重要。以下是对标题和描述中提及的Java运算符优先级的详细说明: 1. **括号()*...

    三目运算法则

    3. **类型兼容性**:确保表达式1和表达式2的返回类型相同,以避免类型转换错误。 #### 七、总结 三目运算法则是编程中一种重要的逻辑控制结构,它通过简洁的语法实现了条件分支的功能,提高了代码的可读性和效率。...

    四川大学java3课件

    - 强制类型转换:程序员可以通过强制类型转换将高级别的数据类型转换为低级别,但需要注意可能导致数据丢失或溢出的风险。 6. **运算符和表达式**: - 算术运算符:如加法(+)、减法(-)、乘法(*)、除法(/)...

    运算符优先级.docx

    - 但有三个运算符是从右到左结合的:单目运算符、条件运算符(三目运算符,`? :`)和赋值运算符。例如,在`a = b = c = 5;`中,首先计算`c = 5`,然后`b = 5`,最后`a = 5`。 3. **特殊示例**: - `1 ...

    Java运算符 (优先级、目数) [1].doc

    Java运算符是编程语言中用于执行特定计算或操作的关键元素,它们在编写程序时起着至关重要的作用。本文将详细阐述Java运算符的优先级和目数,帮助开发者更好地理解和运用这些运算符。 1. **优先级**: - 优先级...

    java程序设计第讲PPT教案学习.pptx

    6. 条件运算符(三目运算符): - 形式为`条件 ? 表达式1 : 表达式2`,根据条件的真假选择执行其中一个表达式。 7. 其他运算符(位运算符和移位运算符): - 包括按位与`&`,按位或`|`,按位异或`^`,按位非`~`,...

    100家互联网大公司java笔试题汇总

    在Java中,三目运算符 `(条件) ? 表达式1 : 表达式2` 用于根据条件判断执行哪个表达式。在给定的题目中,由于 `x>4` 的条件不成立,因此执行 `9`。由于 `99.9` 是 `double` 类型,而 `9` 是 `int` 类型,根据类型...

    c和c++运算符优先级

    :` 是一个三目运算符,用于执行条件操作。赋值运算符 `=` 及其复合赋值形式(如 `+=`、`*=` 等)用于将一个表达式的值赋给另一个表达式。这些运算符从右至左结合。 #### 逗号运算符 `,` 运算符用于连接多个表达式...

    java se基础知识

    - **三目运算符**:`(条件)? 值1 : 值2` #### 控制流程语句 - **switch 语句**:可用于多分支选择,变量类型需为 `byte`, `short`, `int`, `char`。 - **while** 和 **do-while** 语句:`while` 先判断条件后执行...

    Java语言程序设计-模拟题

    Java语言程序设计模拟题主要考察了Java编程的基础知识,包括字符串操作、类的使用、异常处理、基本数据类型、运算符、数组、循环结构、条件判断、方法的使用以及Java的关键字等。以下是对这些知识点的详细解释: 1....

    Java基础之数据类型,运算符与流程控制[归纳].pdf

    、^)、位运算符(&、|、~、^、、>>、>>>)和三目运算符(condition ? value1 : value2)。 流程控制是程序结构的关键部分。顺序结构按照代码的书写顺序执行。分支结构如if语句,可以有多种形式,包括简单的if、if-...

    国开电大 Java语言程序设计 形考任务1-2答案.pdf

    7. **浮点类型限制**:Java中的浮点类型包括`float`和`double`,声明`float f=5.2`是错误的,因为5.2是一个双精度浮点数,需要强制类型转换才能赋值给`float`。 8. **变量交换**:在Java中,交换两个变量的值通常...

Global site tag (gtag.js) - Google Analytics