2016-03-24 4 views
0

私はこのプロジェクトについて前にここに投稿しました。その質問はここで素晴らしいコミュニティによって回答されました。私は、テキストファイルを読み込んでテキストファイルに項目の配列を作成し、それらをユーザーに印刷する自動販売機を作成しています。ユーザーはその選択を行います。私は別のものにぶつかった。NoSuchElementExceptionとEclipse

私のプログラムはeclipseでうまく動作しますが、問題はゼロになります。ほとんどの例外について考えてみました。

問題は、私のプログラムを予想通りの出力と比較する私のコースグレードチェッカーで実行したときに発生します。つまり、プログラムの実行方法と、実行時に返す値を示します。

このプログラムでは、期待通りの値が表示されません。私はテキストファイルをアップロードしないので、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

ニースコードのダンプ....しかし、とにかく 'NoSuchElementException'は、あなたが' FileScannerか何か 'を持っていて、そこにあるものより多くを読み込もうとしているときに典型的に起こります。 – 3kings

+0

@ 3kingsそれが意味することを理解していることを確認してください:作成されたFilescannerは基本的にテキストファイルからいくつかのコードを読み込もうとしていますが、アクセスしようとすると存在しないか、 ?それとも間違っているのですか? (コードダンプに対する謝罪、私がそれが助けてくれることを望んでいたものを非常に心配して投稿した) – dpb0071

答えて

1

NoSuchElementException

012列挙にそれ以上の要素がないと、EnumerationのnextElementメソッドによってスローされ
public class NoSuchElementException 
    extends RuntimeException 

。あなたは今まであなたが実際に取得するために次の要素を持っているかどうかをテストすることなくinput.next();またはinput.nextDouble();または何を呼んでいるあなたのドライバのクラスで

。このタイプのエラーを防ぐには、if (input.hasNext())またはwhile (input.hasNext())をある種の方法で組み込む必要があります。

関連する問題