NoSuchElementException 和 Eclipse

NoSuchElementException and Eclipse

我之前在这里发布过关于这个项目的帖子,这个问题得到了这里很棒的社区的回答。我正在创建一个读取文本文件的自动售货机,在文本文件中创建一个项目数组并将它们打印给用户,然后用户做出选择。我遇到了另一个障碍。

所以我的程序在 eclipse 中运行良好,我遇到了零个问题,而且我已经处理了我能想到的大多数异常。

当我 运行 我的程序通过我的课程成绩检查器将我的程序与预期输出进行比较时,问题就来了。换句话说,它显示了程序应该如何 运行ning 以及当 运行.

时应该返回什么值

现在程序没有打印与预期相同的值,我认为这会导致 FileNotFoundException,因为我没有上传文本文件,一方面让我感到困惑。当需要从机器中 select 一个项目时,我收到了 NoSuchElementException。我不知道为什么它会在检查器中执行此操作但在 Eclipse 中工作正常。非常感谢任何见解。

VendingMachine.java

import java.io.*;
import java.util.*;

import java.text.NumberFormat;
/*************************************************************************
* Simulates a real life vending machine with stock read from a file.
* 
* CSCE 155A Spring 2016
* Assignment 4
* @file VendingMachine.java
* @author Jeremy Suing
* @version 1.0
* @date March 7, 2016
*************************************************************************/
public class VendingMachine {

//data members
private Item[] stock;  //Array of Item objects in machine
private double money;  //Amount of revenue earned by machine


/*********************************************************************
 * This is the constructor of the VendingMachine class that take a
 * file name for the items to be loaded into the vending machine.
 *
 * It creates objects of the Item class from the information in the 
 * file to populate into the stock of the vending machine.  It does
 * this by looping the file to determine the number of items and then
 * reading the items and populating the array of stock. 
 * 
 * @param filename Name of the file containing the items to stock into
 * this instance of the vending machine. 
 * @throws FileNotFoundException If issues reading the file.
 *********************************************************************/
public VendingMachine(String filename) throws FileNotFoundException{
        //Open the file to read with the scanner
        File file = new File(filename);
        Scanner scan = new Scanner(file);

        //Determine the total number of items listed in the file
        int totalItem = 0;
        while (scan.hasNextLine()){
        scan.nextLine();
        totalItem++;
    } //End while another item in file
    //Create the array of stock with the appropriate number of items
    stock = new Item[totalItem];
    scan.close();

    //Open the file again with a new scanner to read the items
    scan = new Scanner(file);
    int itemQuantity = -1;
    double itemPrice = -1;
    String itemDesc = "";
    int count = 0;
    String line = "";

    //Read through the items in the file to get their information
    //Create the item objects and put them into the array of stock
    while(scan.hasNextLine()){
        line = scan.nextLine();
        String[] tokens = line.split(",");
        try {
            itemDesc = tokens[0];
            itemPrice = Double.parseDouble(tokens[1]);
            itemQuantity = Integer.parseInt(tokens[2]);

            stock[count] = new Item(itemDesc, itemPrice, itemQuantity);
            count++;
        } catch (NumberFormatException nfe) {
            System.out.println("Bad item in file " + filename + 
                    " on row " + (count+1) + ".");
        }
    } //End while another item in file

    scan.close();

    //Initialize the money data variable.
    money = 0.00;

} //End VendingMachine constructor

//To run the successful transaction
public void vend(double userInput, String userInput2) {
    NumberFormat d = NumberFormat.getCurrencyInstance();
    Scanner input = new Scanner(System.in);
    boolean a = false;
    boolean b = false;

    String item = new String(userInput2);
    double userMoney = userInput;
    int errorNum = 0;
    double addMoney = 0;
    int itemSelect = 0;


    if (userMoney==-4){
        //errorNum=-4;
        //this.outputMessage(userInput, errorNum);
        a = true;
        b=true;
    }
    while(!a){
        b=false;
        System.out.println("You now have " + d.format(userMoney) + " to spend. Please make a selection (enter 0 to exit): ");
        item = input.next();
        do{
            try{
                itemSelect = Integer.parseInt(item);
            } catch (InputMismatchException e){
                System.out.println("Invalid Entry!");
                System.out.println("You now have " + d.format(userInput) + " to spend. Please make a selection (enter 0 to exit): ");
            }
        }while(!checkNum(item));

        while(!b){
            if(itemSelect==0){
                System.out.println("You did not buy anything from this vending machine. Your change is " + d.format(userMoney));
                b=true;
                a=true;
            } else if ((userMoney-stock[itemSelect-1].itemPrice)<0.00){
                errorNum=-1;
                this.outputMessage(userMoney, errorNum);
                addMoney = input.nextDouble();
                if (addMoney==-1){
                    errorNum = -3;
                    this.outputMessage(userMoney, errorNum);
                    b=true;
                    a=true;
                }
                userMoney = userMoney + addMoney;
                b=true;
            } else if (stock[itemSelect-1].itemQuantity==0){
                errorNum = -2;
                this.outputMessage(userMoney, errorNum);
                b=true;
            } else {
                userMoney = userMoney-stock[itemSelect-1].itemPrice;
                money = (money + stock[itemSelect-1].itemPrice);
                this.outputMessage(userMoney, itemSelect);

                stock[itemSelect-1].itemQuantity = stock[itemSelect-1].itemQuantity - 1;

                b=true;
                a=true;
            }


        }



    }

}

//To determine whether or not the transaction was successful 
public void outputMessage(double userInput, int userInput2) {
    NumberFormat d = NumberFormat.getCurrencyInstance();
    if(userInput2==-1){
        System.out.println("You do not have enough money. Please add more money or exit.");
        System.out.println("Please enter some money into the machine (enter -1 to exit): ");
    } else if (userInput2==-2) {
        System.out.println("Sorry, we are out of this item.");
    } else if (userInput2==-3) {
        System.out.println("You are exiting the vending machine. Your change is " + d.format(userInput));
    } else {
        System.out.println("You have purchased " + stock[userInput2-1].itemDesc + " for " + d.format(stock[userInput2-1].itemPrice) + ". Your change is " + d.format(userInput) + ".");

    }



}

//To print the items in held in stock
public void printMenu()  {
    System.out.println("Item#" + "\t" + "Item" + "\t  " + "Price" + "\t  " + "Qty");
    for(int i=0; i<stock.length;i++){
        System.out.println( (i+1) + "\t" + stock[i]);
    }

}
 public static boolean checkNum(String userInput) {

     try {

         Integer.parseInt(userInput);

         return true;

     } catch (NumberFormatException e) {

         return false;
     }   
 }
public double getMoney() {
    return money;
}



} //End VendingMachine class definition

Item.java

import java.util.*;
import java.text.NumberFormat;

public class Item {
String itemDesc;
double itemPrice;
int itemQuantity;

public Item (String itemDesc, double itemPrice, int itemQuantity){

    this.itemDesc = itemDesc;
    this.itemPrice = itemPrice;
    this.itemQuantity = itemQuantity;
}
public String toString(){
    NumberFormat d = NumberFormat.getCurrencyInstance();
    return itemDesc + "\t" + " " + d.format(itemPrice) + "\t" + " " + itemQuantity + "\t";
}

}

VendingMachineDriver.java

import java.util.*;
import java.io.*;
import java.text.NumberFormat;
public class VendingMachineDriver {



public static void main(String args[]) throws FileNotFoundException {
    Scanner input = new Scanner(System.in);
    //String vendingSelect = input.next();
    String a = new String("a");
    String b = new String("b");
    String x = new String("x");
    String item = "0";
    boolean exit = false;
    VendingMachine drinks = new VendingMachine("drinks");
    VendingMachine snacks = new VendingMachine("snacks");
    NumberFormat d = NumberFormat.getCurrencyInstance();

    while(!exit){
        boolean c = false;
        System.out.println("Welcome to Jeremy's Super Vending Machines!");
        System.out.println("Please select a vending machine:");
        System.out.println("A-Drinks, B-Snacks, X-Exit");
        String vendingSelect = input.next();

        while(!c){
            if(a.equalsIgnoreCase(vendingSelect)){

                drinks.printMenu();
                System.out.println("Please enter some money into the machine (enter -1 to exit)");
                double money = input.nextDouble();

                if (money==-1){
                    System.out.println("You did not buy anything from this vending machine. Your change is " + d.format(0) + "." );
                    c = true;

                } else {
                    System.out.println("You now have " + d.format(money) + " to spend. Please make a selection (enter 0 to exit): ");
                    item = input.next();
                    drinks.vend(money, item);
                    c=true;

                }



            }

            else if(b.equalsIgnoreCase(vendingSelect)){
                snacks.printMenu();
                System.out.println("Please enter some money into the machine (enter -1 to exit)");
                double money = input.nextDouble();

                if (money==-1){
                    System.out.println("You did not buy anything from this vending machine. Your change is " + d.format(0) + "." );
                    c = true;

                }
                else {
                    System.out.println("You now have " + d.format(money) + " to spend. Please make a selection (enter 0 to exit): ");
                    item = input.next();

                    snacks.vend(money, item);
                    c=true;

                }
            } else if(x.equalsIgnoreCase(vendingSelect)){
                double errorNum = -4;
                snacks.vend(errorNum, item);
                System.out.println("The vending machines made a total of " + d.format(drinks.getMoney()) + "." );
                System.out.println("Thank you for your business!");
                c=true;
                exit=true;
            }

        }


    }



}
}

NoSuchElementException

public class NoSuchElementException
    extends RuntimeException

Thrown by the nextElement method of an Enumeration to indicate that there are no more elements in the enumeration.

在您的驱动程序 class 中,您正在调用 input.next();input.nextDouble(); 或其他任何内容,而无需测试您是否真的有下一个要获取的元素。您需要以某种方式合并 if ( input.hasNext() )while (input.hasNext()) 以防止此类错误。