Когда я запускаю свой код, он будет работать нормально до строки «scanner.close ()». После этого, когда я запускаю метод "SumTenNumbers()"... он запустит первую строку цикла while один раз и вылетит с "NoSuchElementException"... Когда я удаляю код над строкой, вызывающей метод, он работает нормально... Почему это происходит, и как я могу решить эту проблему?
Это код:
public class Main
{
public static void main(String[] args)
{
// we use the class "scanner" for input data
Scanner scanner = new Scanner(System.in); //System.in allows you to type input data into the console which can be returned into the console
System.out.println("Enter your name: ");
String name = scanner.nextLine();
System.out.println("Your name is " + name);
System.out.println("Enter your year of birth: ");
boolean isInt = scanner.hasNextInt();
if (isInt)
{
int yearOfBirth = scanner.nextInt();
int age = 2019 - yearOfBirth;
if (age >= 0 && age <= 120)
{
System.out.println("You are " + age + " years old");
}
else
{
System.out.println("Invalid year of birth");
}
}
else
{
System.out.println("Unable to parse year of birth");
}
scanner.close(); // we must close scanner
SumTenNumbers();
}
public static void SumTenNumbers()
{
var reader = new Scanner(System.in);
int sum = 0;
int count = 1;
while (count < 11)
{
System.out.println("Enter number " + count + ": ");
boolean valid = reader.hasNextInt();
if (valid)
{
int userNum = reader.nextInt();
sum += userNum;
count++;
}
else
{
reader.next();
System.out.println("INVALID");
}
}
System.out.println(sum);
reader.close();
}
}
Вот как это выглядит, когда я запускаю код...
Enter your name:
Siddharth
Your name is Siddharth
Enter your year of birth:
2001
You are 18 years old
Enter number 1:
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1478)
at com.company.Main.SumTenNumbers(Main.java:64)
at com.company.Main.main(Main.java:39)
Process finished with exit code 1
Итак, в вашем случае поместите закрытие после SumTenNumbers, удалите новое и закройте из SumTenNumbers, сделайте общедоступным static void SumTenNumbers (считыватель сканера) и вызовите SumTenNumbers (сканер);
строка reader.close()
замыкает Scanner
, а вместе с ней и System.in
.
После этого вы больше не сможете читать из stdin
(System.in
).
Для предотвращения этого вы можете:
используйте только один объект Scanner
и закройте его после последнего использования
закрыть System.in
после использования в последний раз (используя Scanner
или System.in.close())
закрыть System.in
в конце вашей программы
никогда не закрывайте System.in
(Проблема: другие процессы не могут использовать ресурс, stdin
также может быть файлом, сетевым подключением или чем-то еще)
я понимаю. Спасибо! Я реализую это в своем коде
"мы должны закрыть сканер" почему вы так думаете?