java.util.NoSuchElementException - Scanner reading user input

后端 未结 4 2062
灰色年华
灰色年华 2020-11-21 05:30

I\'m new to using Java, but I have some previous experience with C#. The issue I\'m having comes with reading user input from console.

I\'m running into the \"java.u

4条回答
  •  抹茶落季
    2020-11-21 05:49

    The problem is

    When a Scanner is closed, it will close its input source if the source implements the Closeable interface.

    http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

    Thus scan.close() closes System.in.

    To fix it you can make

    Scanner scan static and do not close it in PromptCustomerQty. Code below works.

    public static void main (String[] args) {   
    
    // Create a customer
    // Future proofing the possabiltiies of multiple customers
    Customer customer = new Customer("Will");
    
    // Create object for each Product
    // (Name,Code,Description,Price)
    // Initalize Qty at 0
    Product Computer = new Product("Computer","PC1003","Basic Computer",399.99); 
    Product Monitor = new Product("Monitor","MN1003","LCD Monitor",99.99);
    Product Printer = new Product("Printer","PR1003x","Inkjet Printer",54.23);
    
    // Define internal variables 
    // ## DONT CHANGE 
    ArrayList ProductList = new ArrayList(); // List to store Products
    String formatString = "%-15s %-10s %-20s %-10s %-10s %n"; // Default format for output
    
    // Add objects to list
    ProductList.add(Computer);
    ProductList.add(Monitor);
    ProductList.add(Printer);
    
    // Ask users for quantities 
    PromptCustomerQty(customer, ProductList);
    
    // Ask user for payment method
    PromptCustomerPayment(customer);
    
    // Create the header
    PrintHeader(customer, formatString);
    
    // Create Body
    PrintBody(ProductList, formatString);   
    }
    
    static Scanner scan;
    
    public static void PromptCustomerQty(Customer customer, ArrayList ProductList)               {
    // Initiate a Scanner
    scan = new Scanner(System.in);
    
    // **** VARIABLES ****
    int qty = 0;
    
    // Greet Customer
    System.out.println("Hello " + customer.getName());
    
    // Loop through each item and ask for qty desired
    for (Product p : ProductList) {
    
        do {
        // Ask user for qty
        System.out.println("How many would you like for product: " + p.name);
        System.out.print("> ");
    
        // Get input and set qty for the object
        qty = scan.nextInt();
    
        }
        while (qty < 0); // Validation
    
        p.setQty(qty); // Set qty for object
        qty = 0; // Reset count
    }
    
    // Cleanup
    
    }
    
    public static void PromptCustomerPayment (Customer customer) {
    // Variables
    String payment = "";
    
    // Prompt User
    do {
    System.out.println("Would you like to pay in full? [Yes/No]");
    System.out.print("> ");
    
    payment = scan.next();
    
    } while ((!payment.toLowerCase().equals("yes")) && (!payment.toLowerCase().equals("no")));
    
    // Check/set result
    if (payment.toLowerCase() == "yes") {
        customer.setPaidInFull(true);
    }
    else {
        customer.setPaidInFull(false);
    }
    }
    

    On a side note, you shouldn't use == for String comparision, use .equals instead.

提交回复
热议问题