System.out.println-method无法正常工作

时间:2011-09-07 16:16:12

标签: java

我正在一本名为“Java,如何编程”的书中进行练习。我创建了一个包含2个类的小程序。该程序应该由硬件商店用于表示所售商品的发票。它应该包括4条信息:项目编号的字符串值,描述产品的字符串值,销售商品数量的int值,以及商品价格的双重值。我在一个包含main方法的类中创建了该类的2个对象。我应该为每个实例变量使用“set和get-methods”。

问题是当程序提示用户写入变量的值时,它不会读取变量“second items number”的第一个值(命令窗口副本中的第5行)。我真的不能在代码中读到为什么会发生这种情况。有人可以帮帮我吗?

这两个类的代码如下:

public class aInvoice
    {
    private String number;
    private String description;
    private int quantity;
    private double price;

    public aInvoice(String pNumber, String pDescription, int pQuantity, double pPrice)
        {
        number = pNumber;
        description = pDescription;
        if (pQuantity < 0)
        {quantity = 0;}
        else
        {quantity = pQuantity;}
        if (pPrice < 0)
        {price = 0;}
        else
        {price = pPrice;}
        }

    public String getNumber()
        {
        return number;
        }
    public String getDescription()
        {
        return description;
        }
    public int getQuantity()
        {
        return quantity;
        }
    public double getPrice()
        {
        return price;
        }

    double totalAmount;
    public double getaInvoiceTotalAmount()
        {
        return quantity * price;
        }
    }

    import java.util.Scanner;
    public class aInvoiceTest
    {
    public static void main(String[]args)
        {
        String partNumber1 = null;
        String partDescription1 = null;
        int partQuantity1 = 0;
        double partPrice1 = 0.0;
        String partNumber2 = null;
        String partDescription2 = null;
        int partQuantity2 = 0;
        double partPrice2 = 0.0;

        Scanner input = new Scanner (System.in);
        System.out.print( "Enter first items number: ");
        partNumber1 = input.nextLine();
        System.out.print( "Enter description: ");
        partDescription1 = input.nextLine();
        System.out.print( "Enter quantity: ");
        partQuantity1 = input.nextInt();
        System.out.print( "Enter price: $");
        partPrice1 = input.nextDouble();
        System.out.print( "Enter second items number: ");
        partNumber2 = input.nextLine();    
        System.out.print( "Enter description: ");
        partDescription2 = input.nextLine();
        System.out.print( "Enter quantity: ");
        partQuantity2 = input.nextInt();
        System.out.print( "Enter price: $");
        partPrice2 = input.nextDouble();

        aInvoice aInvoice1 = new aInvoice(partNumber1, partDescription1, partQuantity1, partPrice1);
        aInvoice aInvoice2 = new aInvoice(partNumber2, partDescription2, partQuantity2, partPrice2);

        System.out.printf( "\n\nPart 1´s item number: %s\nItem description: %s\nQuantity: %d\nPrice each: $ %.2f\n\n", aInvoice1.getNumber(), aInvoice1.getDescription(), aInvoice1.getQuantity(), aInvoice1.getPrice () );

         System.out.printf( "\n\nPart 2´s item number: %s\nItem description: %s\nQuantity: %d\nPrice each: $ %.2f\n\n", aInvoice2.getNumber(), aInvoice2.getDescription(), aInvoice2.getQuantity(), aInvoice2.getPrice () );

        System.out.printf( "Total amount: $ %.2f\n\n", (aInvoice1.getaInvoiceTotalAmount() + aInvoice2.getaInvoiceTotalAmount()));
        }
    }

在命令窗口中读取是:

输入第一个项目编号:44 输入说明:pc 输入数量:1 输入价格:10美元 输入第二个项目编号:输入说明:phone 输入数量:1 输入价格:100美元

第1部分的项目编号:44 项目描述:pc 数量:1 每个价格:10.00美元

第2部分的项目编号: 物品描述:手机 数量:1 每个价格:100.00美元

总金额:$ 110.00

2 个答案:

答案 0 :(得分:2)

这是因为在使用input.nextInt()或input.nextDouble()读取输入后,需要在尝试读取另一个字符串之前清除缓冲区。

当用户在5.0中键入时,5.0从输入缓冲区中获取,但是回车符被保留。你可以输入一个input.nextLine(),这将清除回车符。

所以你的代码应该是

    System.out.print( "Enter price: $");
    partPrice1 = input.nextDouble();

    input.nextLine();

    System.out.print( "Enter second items number: ");
    partNumber2 = input.nextLine();    
    System.out.print( "Enter description: ");
    partDescription2 = input.nextLine();
    System.out.print( "Enter quantity: ");
    partQuantity2 = input.nextInt();
    System.out.print( "Enter price: $");
    partPrice2 = input.nextDouble();

答案 1 :(得分:1)

基本上,问题是当你调用nextInt / nextDouble时,这些函数只获取输入流中实际存在的数字部分。他们没有读到点击那里的“输入”键的输入字符。只需在input.nextLine();之后添加input.nextInt()等等。

这似乎是您看到的问题:Using scanner.nextLine()