0

The basis of this program is to have a menu that leads to various different "lessons" that need to be completed. The toMenu() method runs and returns a value back to the main method correctly, and the beginning text of the method3_13() that states "Please enter a positive integer below: ", but after that an error message is displayed. This is the error message:

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)

Below is the code that I have written so far... Please help ;~;

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();
}
}
  • Does this answer your question? [How to use java.util.Scanner to correctly read user input from System.in and act on it?](https://stackoverflow.com/questions/26446599/how-to-use-java-util-scanner-to-correctly-read-user-input-from-system-in-and-act) – Tim Hunter Sep 10 '20 at 21:52
  • TLDR: You need to be sure to be using the `hasNext()` and its various other forms to be sure you have input to grab before trying to grab it. It's currently trying to read input from the previous call for input, finding none, and throwing an error as a result. – Tim Hunter Sep 10 '20 at 22:00
  • Oh... the input from the toMenu method? –  Sep 10 '20 at 22:04

2 Answers2

1

@Mert is sort of right, Scanner will close the underlying stream if it is Closable, and since you are using System.in when you instantiate another Scanner you are effectively passing a closed stream and thus the NotSuchElementException. Note the Scanner documentation for nextInt():

@throws NoSuchElementException if input is exhausted.

And for 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.

So just close your Scanner at the end of your application.

leo277
  • 419
  • 2
  • 6
-1

The problem is you are closing the Scanner with input.close() in method toMenu, and you are trying to use scanner again right after. You can't do that.

Try this:

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"

    }

Make sure that you always close the Scanner after you are done using it.

Mert
  • 33
  • 6