Ошибка утверждения / исключение в базовом цикле while

#loops #exception #conditional-statements #assertion

#циклы #исключение #условные операторы #утверждение

Вопрос:

Привет всем, в настоящее время я пытаюсь изучать Java, используя курс MOOC Java Университета Хельсинки. В настоящее время я работаю над этой проблемой:

Напишите программу, которая считывает значения от пользователя до тех пор, пока он не введет 0. После этого программа выводит общее количество введенных отрицательных значений. Нуль, который используется для выхода из цикла, не должен включаться в общее количество чисел.

Я сталкиваюсь с этой ошибкой: java.lang.Ошибка утверждения: Произошло что-то странное. Может случиться так, что ‘class NumberOfNegativeNumbers’ общедоступный статический метод класса void main (String[] args) отсутствует или ваша программа завершилась сбоем из-за исключения. Дополнительная информация java.util.NoSuchElementException: строка не найдена

Я хотел бы решить эту проблему без использования утверждений или уловов, потому что это не было рассмотрено, и просто понять, почему это происходит. Я попытался заменить nextInt() на nextLine() и преобразовать строку в int, используя Integer.valueOf , а также добавить параметры для оператора else, чтобы при num == 0 он прерывался, хотя это не должно быть необходимо, а также перемещать мои условные операторы.

 import java.util.Scanner;

public class NumberOfNegativeNumbers {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int count = 0;

        while (true) {

            System.out.println("Give a number: ");

            int num = scanner.nextInt();

            if (num <= 0){
                count = count   1;
                continue;
            } else if (num >= 0) {
                continue;
            } else {
                break;
            }
        }

        System.out.println("Number of negative numbers: "   count);

    }
}
 

Ответ №1:

Похоже, согласно примеру, который я нашел в Интернете Scanner.nextInt() , ожидается, что он будет использоваться Scanner.hasNextInt() , например, этот пример, который я скопировал с учебного сайта:

 package com.tutorialspoint;

import java.util.*;

public class ScannerDemo {
   public static void main(String[] args) {

      String s = "Hello World! 3   3.0 = 6.0 true ";

      // create a new scanner with the specified String Object
      Scanner scanner = new Scanner(s);

      // find the next int token and print it
      // loop for the whole scanner
      while (scanner.hasNext()) {

         // if the next is a int, print found and the int
         if (scanner.hasNextInt()) {
            System.out.println("Found :"   scanner.nextInt());
         }
         // if no int is found, print "Not Found:" and the token
         System.out.println("Not Found :"   scanner.next());
      }

      // close the scanner
      scanner.close();
   }
}
 

Итак, вероятно, вам нужно обернуть свой код в эту проверку hasNextInt().

Кроме того, вам может потребоваться дважды проверить поток управления, который произойдет, если пользователь введет ноль. Запрос: если scanner.nextInt() возвращает 0, что происходит в опубликованном вами коде? Другим намеком может быть то, что для устранения проблемы, на которую я здесь косвенно указываю, необходимо изменить только два символа.