gpt4 book ai didi

java - 为什么这个表达式按这个顺序求值?

转载 作者:行者123 更新时间:2023-12-02 05:00:30 25 4
gpt4 key购买 nike

在处理包含 Java 中对象的表达式时,我总是检查它们是否是 null在第一个表达式中,后跟 &&然后引用该对象的表达式(例如 obj.length() )以避免 NullPointerException ,因为&&首先计算表达式的左侧(或者我是这么认为的?)。

那么,为什么这个表达式给我一个IndexOutOfBoundsExceptionArrayList长度为2?

        ArrayList<String> tokens = new ArrayList<String>();
tokens.add("hello");
tokens.add("!");
System.out.println(tokens.size()); // 2

if(tokens.size() == 3 && tokens.get(0).equals("r") &&
(tokens.get(2).length() == 0) || tokens.get(2).equalsIgnoreCase("search")) {
System.out.println("hi");
}

它应该首先检查 size 是否确实为 3,以便它可以引用列表中的第三个对象。然而,我认为它似乎首先评估 OR 表达式?

编辑:对我的含糊表示歉意。这里假设ArrayList不为空。我使用 ArrayList 为 null 的示例只是为了说明目的。这里实际发生的情况是,当大小为 2 时,正在访问 ArrayList 中的第三个对象,即使我将大小检查作为第一个表达式,也会导致 IndexOutOfBoundsException (null 是大小为 2 的 ArrayList 的第三个对象)

编辑2:更新了代码以提供更好的示例。我希望该代码能够运行并且 if 语句失败(为假)。但是我得到了 IndexOutOfBoundsException

编辑 3:再次道歉,我收到了 IndexOutOfBoundsException不是NullPointerException

由于该代码片段来自的代码,我无法将表达式分开,因为我知道这确实可以解决这个问题

最佳答案

您的问题是运算符优先级。这是您的条件,格式为单独的行:

tokens.size() == 3
&& tokens.get(0).equals("r")
&& (tokens.get(2).length() == 0)
|| tokens.get(2).equalsIgnoreCase("search")

&& 运算符优先于 || 运算符。您在这里基本上拥有的是:

( tokens.size == 3 && something && something )
|| ( tokens.get(2).equalsIgnoreCase("search") )

由于列表的大小不是 3,因此由 && 运算符连接的部分会失败。但由于 || 运算符的优先级较低,因此接下来将对其进行求值。由于其左侧有 false,因此它将尝试评估右侧。

所以你执行此操作的正确方法是

tokens.size() == 3
&& tokens.get(0).equals("r")
&&
( (tokens.get(2).length() == 0) || tokens.get(2).equalsIgnoreCase("search") )

请注意 || 术语周围额外的一对括号。

关于java - 为什么这个表达式按这个顺序求值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28331081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com