为什么这个 while 循环使用 "and" 运算符而不是 "or"?

Why does this while loop work with "and" operator and not with "or"?

“||”不起作用,并在 while 循环中给出错误消息。 "&&" 可以,这就是我所需要的,但我很好奇为什么它只能那样工作。

这是学校的家庭作业项目。 && 工作得很好,没有给出错误信息。我也试过将各个表达式括起来并切换它们,none 其中有效。

//Below is line 29 in main calling the function
accCount = readAccts(acctNum, balance, MAX_NUM, inputfile);

//actual function attempting to read in data to an array
public static int readAccts(int[] acctNum, double[] balance,
            int MaxAccts, Scanner inputfile)
{
    int accCount = 0;

    //loop inputs account number and balance into array
    while(inputfile.hasNext() || accCount <= 50) {
                    //Line below is line 67 mentioned in error message
        acctNum[accCount] = inputfile.nextInt();
        balance[accCount] = inputfile.nextDouble();
        accCount++;
}

我在使用“||”时收到编译错误消息:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at bankAccount.readAccts(bankAccount.java:67)
    at bankAccount.main(bankAccount.java:29)

||运算符是或运算符。当您的代码检查条件 (inputfile.hasNext() || accCount <= 50) 如果 inputfile.hasNext()accCount<=50 为真时,循环将执行。所以这意味着,即使文件中没有任何内容可读,如果您的 accCount 小于或等于 50,那么代码将 运行 然后在尝试读取时抛出错误一条不存在的线路。

您的 while 循环检查两个条件:input.hasNext()accCount <= 50。如果查看堆栈跟踪,不仅从代码的第 67 行抛出异常,而且异常来自 Scanner class 本身。

查看 the documentation,我们可以看出当输入耗尽时会抛出 NoSuchElementException。这告诉我您对扫描仪 class 的使用有问题。结果是'||'或运算符,当 input.hasNext()accCount <= 50 中至少有一个为真时,循环会继续——因此当没有更多输入但 accCount <= 50 时,您将尝试读取下一个 int第 67 行,扫描仪将抛出异常,就像现在一样。使用 && 可以避免这种情况,因为现在 input.hasNext()accCount <= 50 都必须为真——也就是说,必须有有效的即将输入和有效的帐号。这有意义吗?

&& :它会检查,如果两个条件都满足,那么只有那个块会被执行。

|| :它将检查第一个条件,如果满足则执行该块。 如果第一个条件失败,它将检查第二个条件。

  • 如果您看到错误,它位于第 3 行。 67 即“在 java.util.Scanner.nextInt(来源不明)"。
  • 所以这仅仅意味着在你的条件下,第一个条件失败了 第二个得到了满足,因为你的块被执行了。由于您的 Scanner 没有下一个元素,如果调用 nextInt() 方法也失败。