java.util.NoSuchElementExeption 关于扫描仪 class?
java.util.NoSuchElementExeption regarding the Scanner class?
该程序的基础是有一个菜单,该菜单可以引导您完成各种不同的“课程”。 toMenu() 方法运行并且 returns 一个值正确返回到 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();
}
}
问题是您在方法 toMenu 中使用 input.close() 关闭了扫描仪,之后您正试图再次使用扫描仪。你不能那样做。
试试这个:
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"
}
确保在使用完扫描仪后始终将其关闭。
@Mert 是对的,如果 Scanner 是可关闭的,Scanner 将关闭底层流,并且由于您在实例化另一个 Scanner 时使用 System.in,您实际上是在传递一个已关闭的流,从而传递 NotSuchElementException。请注意 nextInt() 的扫描仪文档:
@throws NoSuchElementException if input is exhausted.
对于 close():
If this scanner has not yet been closed then if its underlying readable also implements the Closeable interface then the readable's close method will be invoked.
所以只需在应用程序结束时关闭扫描器即可。
该程序的基础是有一个菜单,该菜单可以引导您完成各种不同的“课程”。 toMenu() 方法运行并且 returns 一个值正确返回到 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();
}
}
问题是您在方法 toMenu 中使用 input.close() 关闭了扫描仪,之后您正试图再次使用扫描仪。你不能那样做。
试试这个:
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"
}
确保在使用完扫描仪后始终将其关闭。
@Mert 是对的,如果 Scanner 是可关闭的,Scanner 将关闭底层流,并且由于您在实例化另一个 Scanner 时使用 System.in,您实际上是在传递一个已关闭的流,从而传递 NotSuchElementException。请注意 nextInt() 的扫描仪文档:
@throws NoSuchElementException if input is exhausted.
对于 close():
If this scanner has not yet been closed then if its underlying readable also implements the Closeable interface then the readable's close method will be invoked.
所以只需在应用程序结束时关闭扫描器即可。