提问人: 提问时间:9/11/2020 更新时间:9/11/2020 访问量:960
java.util.NoSuchElementExeption 关于 Scanner 类?
java.util.NoSuchElementExeption regarding the Scanner class?
问:
该程序的基础是有一个菜单,该菜单可以导致需要完成的各种不同“课程”。toMenu() 方法运行并正确地返回 main 方法的值,以及 method3_13() 的开头文本,该文本指出“请在下面输入正整数:”,但之后会显示错误消息。这是错误消息:
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:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Chapter3ShortAnswers.method3_13(Chapter3ShortAnswers.java:67)
at Chapter3ShortAnswers.main(Chapter3ShortAnswers.java:15)
以下是我到目前为止编写的代码......请帮忙;~;
import java.util.Scanner;
public class Chapter3ShortAnswers {
public static void main(String []args) {
int lesson = toMenu(); //takes user to menu and returns user-inputted value
switch (lesson) { // switch statement that leads the user to each method's lesson
case 0: System.out.println("Thank you for running this program! Have a great day!");
case 1: method3_13();
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
}
}
/**
* FINSH THIS AT THE END
* pre: none
* post: returns number to lesson
* while: accept user input number
*/
public static int toMenu() {
Scanner input = new Scanner(System.in);
int chapterNum;
System.out.println("Table of Contents ... Please type the number adjacent to the Lesson you would like to visit \n(Press 0 to go back to the menu, press 0 again to end the program): \n");
System.out.format("%-10s %8s", "Lesson", "Input Number\n"); // each lesson has a respective number the user
// this is the number the user inputs
System.out.format("%-10s %8s", "3.13", "1\n");
System.out.format("%-10s %8s", "3.14", "2\n");
System.out.format("%-10s %8s", "3.15", "3\n");
System.out.format("%-10s %8s", "3.16", "4\n");
System.out.format("%-10s %8s", "3.18", "5\n");
System.out.format("%-10s %8s", "3.19", "6\n");
System.out.format("%-10s %8s", "3.20", "7\n");
System.out.format("%-10s %8s", "3.21", "8\n");
System.out.println("\nType your number here: ");
chapterNum = input.nextInt();
input.close();
return chapterNum; // returns the user inputed number back to the main menu, which assigns it to variable "lesson"
}
/**
*
*/
public static void method3_13() {
int chapterNum = 0;
int user;
Scanner input = new Scanner(System.in);
System.out.println("Please enter a positive integer below: ");
user = input.nextInt();
if(user % 1 == 0 && user >= 0) {
System.out.println("Thank you for entering a number! To go back to the menu and choose another lesson, press 0. ");
} else {
while (user % 1 != 0 || user < 0) {
if(user % 1 != 0) {
System.out.println("This is not an integer. Please try again with an integer.");
} else if (user < 0) {
System.out.println("This is not a positive ineger. Please try again with a positive integer");
} else if (user % 1 != 0 && user < 0) {
System.out.println("This is not an integer, nor is it positive. Please try again with a positive integer.");
}
}
if (user % 1 == 0) {
System.out.println("Thank you for entering a number! To go back to the menu and choose another lesson, press 0.");
chapterNum = input.nextInt();
if(chapterNum == 0) {
toMenu();
}
}
}
input.close();
}
}
答:
-1赞
Mert
9/11/2020
#1
问题是您正在使用 toMenu 方法中的 input.close() 关闭 Scanner,并且您正在尝试再次使用 scanner。你不能这么做。
试试这个:
public static int toMenu() {
Scanner input = new Scanner(System.in);
int chapterNum;
System.out.println("Table of Contents ... Please type the number adjacent to the Lesson you would like to visit \n(Press 0 to go back to the menu, press 0 again to end the program): \n");
System.out.format("%-10s %8s", "Lesson", "Input Number\n"); // each lesson has a respective number the user
// this is the number the user inputs
System.out.format("%-10s %8s", "3.13", "1\n");
System.out.format("%-10s %8s", "3.14", "2\n");
System.out.format("%-10s %8s", "3.15", "3\n");
System.out.format("%-10s %8s", "3.16", "4\n");
System.out.format("%-10s %8s", "3.18", "5\n");
System.out.format("%-10s %8s", "3.19", "6\n");
System.out.format("%-10s %8s", "3.20", "7\n");
System.out.format("%-10s %8s", "3.21", "8\n");
System.out.println("\nType your number here: ");
chapterNum = input.nextInt();
return chapterNum; // returns the user inputed number back to the main menu, which assigns it to variable "lesson"
}
确保在使用完扫描仪后始终关闭扫描仪。
1赞
leo277
9/11/2020
#2
@Mert是正确的,如果底层流是可闭合的,Scanner 将关闭它,并且由于您在实例化另一个 Scanner 时使用的是 System.in,因此您实际上是在传递一个封闭的流,从而传递 NotSuchElementException。请注意 nextInt() 的 Scanner 文档:
如果输入已用尽,则@throws NoSuchElementException。
对于 close():
如果此扫描程序尚未关闭,则如果其基础可读对象也实现了 Closeable 接口,则将调用可读对象的关闭方法。
因此,只需在应用程序结束时关闭扫描仪即可。
评论
hasNext()