如何在字符串后面输入一个整数?

时间:2018-04-01 01:53:14

标签: java nosuchelementexception

这是我打印购物清单的代码。当我通过键盘在运行时手动输入数据时,它工作正常。但是当我在命令行中将 input.txt 文件作为参数引导时,它会在第一次迭代后抛出 NoSuchElementException

我认为这可能与使用Scanner.next()和Scanner.nextInt()的顺序有关,但不确定。

我该如何解决这个问题?

import java.io.*;
import java.util.*;
class Product
{
    Scanner sc = new Scanner(System.in);
    int productID;
    String productName;
    String productType;
    float productPrice;

    Product()
    {
        //  Do Nothing.
    }

    void createProduct()
    {
        System.out.println("Enter the Product ID: ");
        productID = sc.nextInt();
        System.out.println("Enter the Product Name: ");
        productName = sc.next();
        System.out.println("Enter the Product Type: ");
        productType = sc.next();
        System.out.println("Enter the Product Price: ");
        productPrice = sc.nextFloat();
    }

    Product(int pID, String pName, String pType, float pPrice)
    {
        productID = pID;
        productName = pName;
        productType = pType;
        productPrice = pPrice;
    }

    void showIdentification()
    {
        System.out.println(productID + " " + productName);
    }

    void showDetail()
    {
        System.out.println(productID + " " + productName + " " +  productType + " " + productPrice);    
    }
}

class Shop
{
    int n = 10;
    Product list[] = new Product[n];


    void createList()
    {
        for(int i=0; i<n; i++)
        {
            System.out.println("Product No. " + (i+1));
            Product o = new Product();
            o.createProduct();
            o.showDetail();
            list[i] = o;
        }
    }

    void viewAllProducts()
    {
        for(int i=0; i<n; i++)
        {
            list[i].showIdentification();
        }
    }
}

class ShopList
{

    public static void main(String[] args)
    {
        Shop sList = new Shop();
        sList.createList();
        sList.viewAllProducts();
    }
}

这是输入文件: -

1001 CadburyA ChocolateA 15.00
1002 CadburyB ChocolateB 16.00
1003 CadburyC ChocolateC 17.00
1004 CadburyD ChocolateD 18.00
1005 CadburyE ChocolateE 19.00
1006 CadburyF ChocolateF 20.00
1007 CadburyG ChocolateG 21.00
1008 CadburyH ChocolateH 22.00
1009 CadburyI ChocolateI 23.00
1010 CadburyJ ChocolateJ 24.00

这是我得到的例外: -

java ShopList < input.txt
Product No. 1
Enter the Product ID: 
Enter the Product Name: 
Enter the Product Type: 
Enter the Product Price: 
1001 CadburyA Chocolate 15.0
Product No. 2
Enter the Product ID: 
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at Product.createProduct(ShopList.java:19)
    at Shop.createList(ShopList.java:59)
    at ShopList.main(ShopList.java:95)

1 个答案:

答案 0 :(得分:0)

您必须使Scanner静态:

class Product
{
    // There is only one System.in - the Scanner can be shared between 
    // all instances
    static Scanner sc = new Scanner(System.in);
    int productID;
    String productName;
    String productType;
    float productPrice;

    Product ()
    {
        //  Do Nothing.
    }

    void createProduct()
    {
        System.out.println(" Enter the Product ID: ");
        productID = sc.nextInt ();
        // for debugging, I inserted the last value in the printlns:
        System.out.println (productID + " Enter the Product Name: ");
        productName = sc.next ();
        System.out.println (productName + " Enter the Product Type: ");
        productType = sc.next ();
        System.out.println (productType + " Enter the Product Price: ");
        productPrice = sc.nextFloat ();
        System.out.println (productPrice + " ");
        /* Helpless attemps to find out, if we need to consume the line break :)
        String s = "dummy";
        while (s != "\n") {
            s = sc.next ();
            System.out.println ("<" + s + ">");
        }
        */
    }

没有进行任何其他修改。

嗯,不完全是。作为欧洲大陆,我不得不告诉系统,我的数字是点分隔或更好,用逗号分隔。

cat choco.lst | sed 's/\./,/' | java ShopList

您的系统可能不是这种情况。

嗯,ShopList中的扫描仪(未使用)也会消失。