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.

所以只需在应用程序结束时关闭扫描器即可。