Почему этот цикл while работает с оператором "и", а не с "или"? - PullRequest
0 голосов
/ 26 июня 2019

"||" не работает и выдает сообщение об ошибке в цикле while. «&&» делает, и это то, что мне нужно, но мне любопытно, почему это работает только так.

Это для домашнего задания для школы. && отлично работает и не выдает сообщения об ошибках. Я также пытался заключить в скобки отдельные выражения и переключать их, ни одно из которых не сработало.

//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)

Ответы [ 3 ]

3 голосов
/ 26 июня 2019

||оператор является или оператором.Когда ваш код проверяет условие (inputfile.hasNext() || accCount <= 50), если inputfile.hasNext() или accCount<=50 истинно, цикл будет выполнен.Таким образом, это означает, что даже если в файле ничего не осталось для чтения, если ваш accCount меньше или равен 50, код будет запущен и затем выдаст ошибку, когда попытается прочитать несуществующую строку.

2 голосов
/ 26 июня 2019

Ваш цикл while проверяет два условия: input.hasNext() и accCount <= 50. Если вы посмотрите на трассировку стека, исключение выдается не только из строки 67 вашего кода, но также и из самого класса Scanner.

Глядя на документацию , мы можем сказать, что NoSuchElementException выдается, когда ввод исчерпан. Это говорит мне, что что-то не так с вашим использованием класса Scanner. Оказывается с '||' или оператор, когда по крайней мере ОДИН из input.hasNext() или accCount <= 50 имеет значение true, цикл продвигается - следовательно, когда больше нет ввода, НО accCount <= 50, вы затем попытаетесь прочитать следующий int в строке 67, и сканер будет бросить исключение, как это делает сейчас. Использование && позволяет избежать этого, поскольку теперь оба значения input.hasNext() и accCount <= 50 должны быть истинными, то есть должны быть действительные входящие данные и действительный номер счета. Имеет ли это смысл?

0 голосов
/ 26 июня 2019

&&: он проверит, выполнены ли оба условия, тогда будет выполняться только этот блок.

||: он проверит 1-е условие, если выполнено, тогда выполнит блок.если 1-е условие не выполнено, оно проверит 2-е условие.

  • Если вы видите ошибку, ее в строке №.67 т. Е. «At java.util.Scanner.nextInt (Неизвестный источник)».
  • Таким образом, это просто означает, что в ваших условиях 1-е условие не выполнено, а 2-е выполнено из-за выполнения вашего блока.А поскольку у вашего сканера не было следующего элемента, если ему не удалось вызвать также метод nextInt ().
...