三目运算符的错误 2020-05-11 16:02 在Java的三目运算符中,当存在运算时,如果返回的是Integer类型就会触发拆箱,此时**如果返回的Integer是null**,那么就会抛出NullPoint异常(拆箱,将null转化为数字,无法转化)。 ```java package Test; /** * @author: HanXu * on 2020/4/22 * Class description: */ public class Demo4 { /** 三目运算符: condition ? 表达式 1 : 表达式 2 表达式 1 和 2 在涉及算术计算或数据类型转换时,会触发自动拆箱。 */ public static void main2(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Boolean flag = false; Integer result = (flag ? a : c); // 1 正常执行 } public static void main3(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Boolean flag = false; Integer result = (flag ? a * b : c); // 2 当存在运算时(只需存在即可触发拆箱),抛出NullPointerException异常(将Integer类型的null拆箱成int数字,失败) } public static void main4(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Boolean flag = true; Integer result = (flag ? c : a * b); // 3 抛出异常 } public static void main5(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Boolean flag = false; Integer result = (flag ? c : a * b); // 4 正常执行 } public static void main(String[] args) { String a = "111"; String b = "222"; String c = null; Boolean flag = true; String result = (flag ? c : a + b); // 5 正常执行,和 3 不一样的是:这个返回的是String,而不是Integer,所以不会触发拆箱操作。就不会异常。 } } ``` --- 2021-4-25更新,感觉之前写的代码对照不太好理解: ```java public class Demo5 { /*public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Integer result = (true ? c : a * b); // 1 抛出异常 Integer result2 = (true ? c : a); // 2 正常执行 }*/ /*public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Integer result = (true ? a : b * c); // 3 正常执行 }*/ /*public static void main(String[] args) { Integer a = 1; Integer b = 2; Integer c = null; Integer result = (false ? a * c : b); // 4 正常执行 Integer result2 = (false ? a * b : c); // 5 抛出异常 }*/ public static void main(String[] args) { // 6 Integer a = 1; Integer b = null; //Integer c = a * b; // 抛出异常 Object d = a * b; // 抛出异常 //System.out.println(a * b); // 抛出异常 } /* 三目运算符不是“顺序”执行的,true时,则执行表达式1,不会执行表达式2; false时,执行表达式2,不会执行表达式1. 当表达式1或2中有存在算数计算时,在返回结果的时候会执行拆箱操作,若返回的是null,拆箱就会抛出NullPointerException。 6 证明了当设计算数计算会触发自动拆箱,所以我们可以认为当两个Integer进行算数计算时,其中一方有null则会抛出异常。 1 :true时,执行表达式1:c,将Null返回给Integer本身没有问题,可是该三目运算符存在运算(a*b),就会触发拆箱,将c转为int,null无法转为int,所以抛出异常 2 :同1,因为没有存在运算,就不会触发拆箱,正常将null返回给Integer,所以不会抛出异常 3 :true时,执行表达式1:a,将1返回给Integer,存在算数计算,触发拆箱,将1转为Int,正常。(存在运算不代表就要执行计算) 4 :同3 5 :同1 */ } ``` 这个感觉也是Java语言设计的问题,是否抛出异常不应该和没有执行到的计算有关;如若各位能联系到设计团队,烦请帮忙转告这个错误。 --- 感兴趣的话还可以阅读下面的文章: - [Spring中ResponseBodyAdvice的设计错误](http://riun.xyz/work/101 "Spring中ResponseBodyAdvice的设计错误") --END--
发表评论