NoSuchElementException和Eclipse

时间:2016-03-24 21:47:58

标签: java eclipse nosuchelementexception

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

所以我的程序在日食中工作得很好,我遇到了零问题,并且我已经处理了我能想到的大多数异常。

当我通过我的课程成绩检查程序运行我的程序时,问题出现了,该程序将我的程序与预期的输出进行比较。换句话说,它显示了程序应该如何运行以及运行时应该返回什么值。

现在程序没有打印出与预期相同的值,我认为这会导致FileNotFoundException,因为我没有上传文本文件,所以一方面让我感到困惑。当需要从机器中选择一个项目时,我得到一个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;
            }

        }


    }



}
}

1 个答案:

答案 0 :(得分:1)

NoSuchElementException

public class NoSuchElementException
    extends RuntimeException
  

由枚举的nextElement方法抛出,表示枚举中没有更多元素。

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