当前位置: 首页 > 知识库问答 >
问题:

Java三元运算符似乎不一致地将整数转换为int

田彬郁
2023-03-14

这个问题类似于,但不同于关于三值运算符的另一个问题。在这个问题中,空整数必须强制为int,因为函数的返回值是int。然而,在我学生的代码中却不是这样。

这段代码运行良好:

Integer x = (5>7) ? 3 : null;

x的值为NULL。没有NPE。在这种情况下,编译器可以发现三进制运算符的结果需要是整数,因此它将3(一个int)转换为整数,而不是将null转换为int。

Integer x = (5>7) ? 3 : (5 > 8) ? 4 : null;
Integer three = 3;

Integer x = (5>7) ? three : (5 > 8) ? three+1 : null;

共有1个答案

黎震博
2023-03-14

关键在于条件运算符是正确关联的。确定条件表达式的结果类型的规则非常复杂,但它可以归结为:

  1. 第一个(5>8)?4:null,第2个操作数是int,第3个操作数是null,如果我们在表中查找,这个表达式的结果类型是integer。(换句话说:因为其中一个操作数null,所以它被视为引用条件表达式)
  2. 那么我们有(5>7)?3:要计算的 ,这意味着在上面链接的表中,我们需要查找第二个操作数int和第三个操作数int:它是int。这意味着 需要取消装箱,并以NPE失败。

那么为什么第一个案例会起作用呢?

然而,这只发生在null文本中,下面的代码仍将抛出NPE,因为操作数类型intinteger将导致数值条件表达式:

Integer i = null;
Integer x = (5>7) ? 3 : i;

总而言之:它有一种逻辑,但它不是人类的逻辑。

  1. 如果两个操作数都是编译类型整数,则结果为整数.
  2. 如果一个操作数为int类型,而另一个操作数为int类型,则结果为int
  3. 如果一个操作数为null类型(其中唯一有效的值是null引用),则结果为整数
 类似资料:
  • 考虑这段代码: 这在Clang或GCC下不起作用,给我: 错误:不同指针类型“Foo*”和“Bar*”之间的条件表达式缺少强制转换Base*obj=!酒吧foo:bar; 这意味着要编译它,我必须将代码更改为: 既然存在到< code>Base*的隐式转换,那么是什么阻止了编译器这样做呢? 换句话说,为什么不使用强制转换,但使用操作员没有?是因为我不清楚我想使用部件吗?

  • 问题内容: 是否可以更改此: …对三元运算符? 问题答案: 好吧,中的行为就像这样…… …另一种看待它的方式… 你的问题有点含糊,我们必须在这里假设。 如果(且仅当)声明了一个返回值(,等。)-现在看来似乎没有做到这一点通过你的代码-那么你可以做到这一点… 如果callFunction(…)不返回值,那么你将无法使用三元运算符!就那么简单。你将使用不需要的东西。 请发布更多代码以清除所有问题 尽管

  • 问题内容: 有人可以解释为什么这样的代码吗? 产生以下编译器错误: 不兼容的条件操作数类型ArrayList和HashSet 由于我不明白的原因,以下内容解决了该问题 我正在使用Java 1.4。 问题答案: 这是1.4 中的 错误 ,并已根据bugreport 5080917 进行了修复。 评估 这是一个错误。 xxxxx @ xxxxx 2004-07-30

  • 问题内容: 给定一个数字: 将其转换为字符串的“最佳”方法是: 问题答案: 有多种方法: (我的偏爱) (我不知道编译器如何处理它,也许它和上面一样有效)

  • 问题内容: 如何将字符串转换成运算符plus?谢谢! 问题答案: 使用查找表:

  • 问题内容: 我正在使用Stack类来计算涉及整数的简单算术表达式,例如1 + 2 * 3。您的程序将按照给定的顺序执行操作,而与运算符的优先级无关。因此,应计算表达式1 + 2 * 3(1 + 2) 3 = 9,而不是1+(2 * 3)= 7。 如果我得到的输入为1 + 2 * 3,我知道如何将字符串1,2,3转换为Integer。但是我不知道如何将+,*从字符串类型转换为运算符。 我的代码逻辑是