Java 无法使用扫描仪输入行

Java 无法使用扫描仪输入行,java,java.util.scanner,Java,Java.util.scanner,我有两门课:比萨饼和比萨饼。PizzaOrder允许用户在自己的订单中创建一个包含1-3个Pizza的新订单。输入比萨饼数量后,将继续输入每个比萨饼的信息。但我的扫描仪有错误,输入比萨饼的数量后,我不能再输入了 这是我的密码: 等级比萨饼: public class Pizza { public static void main(String[] args){ Pizza pizza1 = new Pizza("Large", 1, 1, 2); Piz

我有两门课:比萨饼和比萨饼。PizzaOrder允许用户在自己的订单中创建一个包含1-3个Pizza的新订单。输入比萨饼数量后,将继续输入每个比萨饼的信息。但我的扫描仪有错误,输入比萨饼的数量后,我不能再输入了

这是我的密码:

等级比萨饼:

public class Pizza {

    public static void main(String[] args){
        Pizza pizza1 = new Pizza("Large", 1, 1, 2);
        Pizza pizza2 = new Pizza("Small", 3, 0, 1);
        Pizza pizza3 = new Pizza("Medium", 1, 1, 3);

        System.out.println(pizza1.getDescription());
        System.out.println(pizza2.getDescription());
        System.out.println(pizza3.getDescription());
    }

    private String size;
    private int numberOfCheese, numberOfPepperoni, numberOfHam;

    public Pizza(String size, int numberOfCheese, int numberOfPepperoni,
            int numberOfHam) {
        super();
        this.size = size;
        this.numberOfCheese = numberOfCheese;
        this.numberOfPepperoni = numberOfPepperoni;
        this.numberOfHam = numberOfHam;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public int getNumberOfCheese() {
        return numberOfCheese;
    }

    public void setNumberOfCheese(int numberOfCheese) {
        this.numberOfCheese = numberOfCheese;
    }

    public int getNumberOfPepperoni() {
        return numberOfPepperoni;
    }

    public void setNumberOfPepperoni(int numberOfPepperoni) {
        this.numberOfPepperoni = numberOfPepperoni;
    }

    public int getNumberOfHam() {
        return numberOfHam;
    }

    public void setNumberOfHam(int numberOfHam) {
        this.numberOfHam = numberOfHam;
    }

    public double calcCost(){
        if(size.equals("Small"))
            return 10 + numberOfCheese*2 + numberOfPepperoni*2 + numberOfHam*2;
        else if(size.equals("Medium"))
            return 12 + numberOfCheese*2 + numberOfPepperoni*2 + numberOfHam*2;
        return 14 + numberOfCheese*2 + numberOfPepperoni*2 + numberOfHam*2;
    }

    public String getDescription(){
        return "Pizza size: "+size + 
                "\nNumber Of Cheese Topping: " + getNumberOfCheese()
                +"\nNumber Of Pepperoni Topping: "+ getNumberOfPepperoni() 
                +"\nNumber Of Ham Topping: "+ getNumberOfHam()
                +"\nPizza cost: " + calcCost()+"$\n"; 
    }
}
类别比萨饼订购:

import java.util.Random;
import java.util.Scanner;

public class PizzaOrder {

    public static void main(String[] args){
        PizzaOrder pizzaOrder = new PizzaOrder();
        pizzaOrder.setNumPizzas(pizzaOrder.numPizzas);
    }

    private Pizza pizza1, pizza2, pizza3;
    private int numPizzas;
    private int id;

    public PizzaOrder(){
        System.out.println("Enter the number of Pizza: ");
        Scanner scanner = new Scanner(System.in);
        this.numPizzas = scanner.nextInt();
        scanner.close();
        Random random = new Random();
        int range = 100 - 0 + 1;
        this.id =  random.nextInt(range) + 0;
    }

    public void setNumPizzas(int numPizzas){
        if(numPizzas == 1){
            System.out.println("-----------Enter Pizza1's Information-----------");
            enterInformation(pizza1);
        }
        else if(numPizzas == 2){
            System.out.println("-----------Enter Pizza1's Information-----------");
            enterInformation(pizza1);
            System.out.println("-----------Enter Pizza2's Information-----------");
            enterInformation(pizza2);
        }
        else if(numPizzas == 3){
            System.out.println("-----------Enter Pizza1's Information-----------");
            enterInformation(pizza1);
            System.out.println("-----------Enter Pizza2's Information-----------");
            enterInformation(pizza2);
            System.out.println("-----------Enter Pizza3's Information-----------");
            enterInformation(pizza3);
        }
    }

    public double calcTotal(){
        return pizza1.calcCost() + pizza2.calcCost() + pizza3.calcCost();
    }

    public void enterInformation(Pizza pizza){
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter the pizza's size: ");
        String size = scanner.nextLine();
        pizza.setSize(size);
        System.out.println("Enter the number of Cheese topping: ");
        int numberOfCheese = scanner.nextInt();
        pizza.setNumberOfCheese(numberOfCheese);
        System.out.println("Enter the number of Pepperoni topping: ");
        int numberOfPepperoni = scanner.nextInt();
        pizza.setNumberOfPepperoni(numberOfPepperoni);
        System.out.println("Enter the number of Ham topping: ");
        int numberOfHam = scanner.nextInt();
        pizza.setNumberOfHam(numberOfHam);
        scanner.close();
        System.out.println("This pizza cost: " + pizza.calcCost() +"$");
    }
}
当我在PizzaOrder类中输入Pizza的数量==1时,它显示错误:

Enter the number of Pizza: 
1
-----------Enter Pizza1's Information-----------
Exception in thread "main" java.lang.NullPointerException
    at bai2.PizzaOrder.enterInformation(PizzaOrder.java:69)
    at bai2.PizzaOrder.setNumPizzas(PizzaOrder.java:30)
    at bai2.PizzaOrder.main(PizzaOrder.java:10)

如何解决此问题?

您应该首先创建
Pizza
实例,然后在
enterInformation

public void enterInformation(Pizza pizza){
    Scanner scanner = new Scanner(System.in);
    ...
}
在每个if语句中,您可以

pizza1 = new Pizza()
System.out.println("-----------Enter Pizza1's Information-----------");
enterInformation(pizza1);
另外,您在
setNumPizzas
中已经有
pizzaOrder.numPizzas
,因此再次传递它是多余的

pizzaOrder.setNumPizzas(pizzaOrder.numPizzas);

我建议您对多个
Pizza
实例使用数组。

不应该使用多个Scanner实例来包装输入流系统。在中,因为一旦关闭它,就不应该再使用它

而是使用System.in声明单个Scanner实例。您可以声明一个包含scanner全局实例的Utils类。或者只是在Pizza或PizzaOrder中放置一个公共静态Scanner实例。-只要它是全球可访问的,任何一种方式都可以

public InputUtil {
    public static Scanner scanner = new Scanner(System.in);
}
用作

InputUtil.scanner.nextInt();

除了不初始化pizza1、2、3的实例外,问题在于您正在关闭流

这里

然后从
setNumPizza
调用
enterInformation

public void enterInformation(Pizza pizza){
    Scanner scanner = new Scanner(System.in);
    ...
}

调用scanner.close后,它将关闭底层流。创建单个实例

我通过替换
scanner.close()
通过
scanner.nextLine()修复了它

以下是我在PizzaOrder类中的代码:

import java.util.Random;
import java.util.Scanner;

public class PizzaOrder {

    public static void main(String[] args){
        PizzaOrder pizzaOrder = new PizzaOrder();
        pizzaOrder.setNumPizzas(pizzaOrder.numPizzas);
        pizzaOrder.getPizzaOrderDescription();
    }

    private Pizza pizza1, pizza2, pizza3;
    private int numPizzas;
    private int id;

    public PizzaOrder(){
        System.out.println("Enter the number of Pizza: ");
        Scanner scanner = new Scanner(System.in);
        this.numPizzas = scanner.nextInt();
        scanner.nextLine();
        Random random = new Random();
        int range = 100 - 0 + 1;
        this.id =  random.nextInt(range) + 0;
    }

    public void setNumPizzas(int numPizzas){
        if(numPizzas == 1){
            pizza1 = new Pizza("", 1, 1, 1);
            System.out.println("-----------Enter Pizza1's Information-----------");
            enterInformation(pizza1);
        }
        else if(numPizzas == 2){
            pizza1 = new Pizza("", 1, 1, 1);
            System.out.println("-----------Enter Pizza1's Information-----------");
            enterInformation(pizza1);
            pizza2 = new Pizza("", 1, 1, 1);
            System.out.println("-----------Enter Pizza2's Information-----------");
            enterInformation(pizza2);
        }
        else if(numPizzas == 3){
            pizza1 = new Pizza("", 1, 1, 1);
            System.out.println("-----------Enter Pizza1's Information-----------");
            enterInformation(pizza1);
            pizza2 = new Pizza("", 1, 1, 1);
            System.out.println("-----------Enter Pizza2's Information-----------");
            enterInformation(pizza2);
            pizza3 = new Pizza("", 1, 1, 1);
            System.out.println("-----------Enter Pizza3's Information-----------");
            enterInformation(pizza3);
        }
    }

    public double calcTotal(){
       if(numPizzas == 1)
          return pizza1.calcCost();
       else if(numPizzas == 2)
          return pizza1.calcCost() + pizza2.calcCost();
       return pizza1.calcCost() + pizza2.calcCost() + pizza3.calcCost();
    }

    public void enterInformation(Pizza pizza){
        Scanner scanner = new Scanner(System.in);
        System.out.println("Enter the pizza's size: ");
        String size = scanner.nextLine();
        pizza.setSize(size);
        System.out.println("Enter the number of Cheese topping: ");
        int numberOfCheese = scanner.nextInt();
        pizza.setNumberOfCheese(numberOfCheese);
        System.out.println("Enter the number of Pepperoni topping: ");
        int numberOfPepperoni = scanner.nextInt();
        pizza.setNumberOfPepperoni(numberOfPepperoni);
        System.out.println("Enter the number of Ham topping: ");
        int numberOfHam = scanner.nextInt();
        pizza.setNumberOfHam(numberOfHam);
        scanner.nextLine();
        System.out.println("This pizza cost: " + pizza.calcCost() +"$");
    }

    public void getPizzaOrderDescription(){
        System.out.println("Your total cost is: " + calcTotal() +"$");
    }
}
输出:

Enter the number of Pizza: 
3
-----------Enter Pizza1's Information-----------
Enter the pizza's size: 
Large
Enter the number of Cheese topping: 
1
Enter the number of Pepperoni topping: 
1
Enter the number of Ham topping: 
1
This pizza cost: 20.0$
-----------Enter Pizza2's Information-----------
Enter the pizza's size: 
Large
Enter the number of Cheese topping: 
1
Enter the number of Pepperoni topping: 
1
Enter the number of Ham topping: 
1
This pizza cost: 20.0$
-----------Enter Pizza3's Information-----------
Enter the pizza's size: 
Small
Enter the number of Cheese topping: 
2
Enter the number of Pepperoni topping: 
2
Enter the number of Ham topping: 
2
This pizza cost: 22.0$
Your total cost is: 62.0$

虽然这不是问题所在,但如果Pizza类没有扩展任何类,为什么要调用
super()
?检查您是否尚未初始化pizza1
。能否突出显示PizzaOrder.java中第69行的代码。@Pavan It's scanner.close();我理解你在这里表达的意思。但是一个新的Scanner实例是否会重新打开底层流并正常工作呢?。为什么它不这样做呢?但是我应该在哪里声明呢?@Pavan Check@khong291 Check但是我应该在哪里声明呢?@khong291你可以创建一个实用类,它只有一个scannerI的公共静态实例,它和你做的一样,但是它显示错误:输入比萨饼的数量:1------输入比萨饼的信息------线程中的异常“main”在bai2.PizzaOrder.enterInformation(PizzaOrder.java:56)在bai2.PizzaOrder.setNumPizzas(PizzaOrder.java:31)在bai2.PizzaOrder.main(PizzaOrder.java:10)首先检查是否(Scanner.hasnetline()),然后调用nextLine