简体   繁体   中英

Keep getting NoSuchElementException with Scanner in Java

I have been learning Java for about three weeks and I'm attempting to write a little vending machine program. For some reason I keep running into a NoSuchElementException through my Scanner, and I've found it is coming from the Item class. I also have my try{} catch{} blocks commented out but I do want to have the ability to catch an InputMismatchException as well. Any help is very much appreciated, I have the code for my Item class below.

``

    import java.util.*;
    public class Item {
      public Item() {  // class constructor
        System.out.println("Choose an item from the list below!");
        System.out.println("(Enter only the item's number): ");
      }
    
      public void Out() {
        Scanner sc = new Scanner(System.in);
    
        ArrayList<String> optionList = new ArrayList<>();  // collection
        String x = "#1 Coffee Creamer";
        String y = "#2 Black Cold Brew";
        String z = "#3 An Actual Tree";
        optionList.add(x);  // add String x to optionList
        optionList.add(y);  // add String y to optionList
        optionList.add(z);  // add String z to optionList
        System.out.println();
    
        for (String str : optionList) {  // print optionList items
          System.out.println(str);
        }
    
        System.out.println();
        System.out.print("Enter a number: ");  // prompt
    
        int itemNumber = sc.nextInt();  // user's input field
    
        // while (true) {  // catch possible InputMismatchException
        //   try {
        //     itemNumber = sc.nextInt();
        //     break;
        //   } catch (Exception e) {
        //     System.out.println("Enter a valid choice.");
        //     System.out.println("Enter a number: ");
        //   }
        //   sc.nextInt();
        // }
    
        while (itemNumber != 1 && itemNumber != 2 && itemNumber != 3) {
          System.out.println("Enter a valid choice.");
          itemNumber = sc.nextInt();
        } if (itemNumber == 1 || itemNumber == 2 || itemNumber == 3) {
            switch (itemNumber) {
              case 1:
                System.out.println("You chose " + optionList.get(0) + "!");
                break;
              case 2:
                System.out.println("You chose " + optionList.get(1) + "!");
                break;
              case 3:
                System.out.println("You chose " + optionList.get(2) + "!");
                break;
            }
        }
    
        System.out.println();
        sc.close();
      }
    }

try:

        Scanner sc = new Scanner(System.in);


        int itemNumber = 0;
        while (true) {
            try {
                itemNumber = sc.nextInt();
                break;
            } catch (Exception e) {
                System.out.println("Enter a valid choice.");
                System.out.println("Enter a number: ");
                sc.next();
            }
        }

sorry, actually not sure what you want to do but if you want to keep asking for correct number you can define function like

    private static int nextInt(Scanner sc) {
        while (true) {
            try {
                return sc.nextInt();
            } catch (Exception e) {
                System.out.println("Enter a number: ");
                sc.next();
            }
        }
    }

and replace all your calls:

itemNumber = sc.nextInt();

with

itemNumber = nextInt(sc)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM