2015-11-02 126 views
-1

我有两个类:比萨和PizzaOrder。 PizzaOrder允许用户按照他的顺序创建1-3个比萨饼的新订单。输入比萨饼的数量后,它会继续输入每个披萨的信息。但是我有Scanner出错,输入比萨后我再也输入不了了。无法输入扫描仪线

这里是我的代码:

类比萨:

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"; 
    } 
} 

类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); 
    } 

    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类比萨== 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) 

如何解决这个问题?

+0

虽然这不是问题,如果你的Pizza类没有扩展任何类,为什么要调用'super()'?检查[不正确的做法是调用super()的类不扩展任何东西?](http://stackoverflow.com/questions/4679314/is-it-bad-practice-to-call-super-in -a-class-that-doesnt-extend-anything) – sam

+0

你还没有初始化'pizza1'。 – dejvuth

+0

您可以突出显示PizzaOrder.java中第69行的代码行: – Pavan

回答

1

,必须先创建Pizza实例,然后声明如果您访问它的成员函数一样pizza.setSizeenterInformation

在每一个;

pizza1 = new Pizza() 
System.out.println("-----------Enter Pizza1's Information-----------"); 
enterInformation(pizza1); 

你也已经pizzaOrder.numPizzassetNumPizzas如此反复传递是多余的;我建议你使用多个Pizza实例的数组。

+0

我和你一样,但它显示错误: 输入比萨的数量: -----------输入Pizza1的信息-----------例外线程 “主要” 输入比萨的尺寸: java.util.NoSuchElementException:没有找到行 \t在java.util.Scanner.nextLine(Scanner.java:1585) \t在bai2.PizzaOrder.enterInformation(PizzaOrder.java: 56) \t在bai2.PizzaOrder.setNumPizzas(PizzaOrder.java:31) \t在bai2.PizzaOrder.main(PizzaOrder.java:10) – Khuong

+0

首先检查(scanner.hasNextLine()),然后调用nextLine –

0

不应该使用扫描仪的多个实例包装输入流System.in,因为一旦你关闭它,它不应该再被使用。

用System.in声明一个Scanner的单个实例。您可以声明一个持有扫描程序全局实例的Utils类。或者只是将一个Scanner的公共静态实例放入Pizza或PizzaOrder中。 - 只要它可以在全球范围内访问,任何一种方式都可以。

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

用作

InputUtil.scanner.nextInt(); 
+0

但我应该在哪里申报? – Khuong

+0

@ khuong291您可以创建一个实用程序类,它只有一个扫描仪的公共静态实例 – Bon

0

随着未初始化pizza1,2,3的情况下,问题是,你从setNumPizza关闭流

这里

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

public PizzaOrder(){ 
    ... 
    scanner.close(); 
    ... 
} 

然后其中呼叫enterInformation

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

一旦您调用scanner.close,它将关闭基础流。创建一个实例

+0

我明白你在这里表达什么。但是Scanner的新实例不会重新打开底层流并且工作得很好吗?为什么它不这样做? – Pavan

+0

但我应该在哪里申报? – Khuong

+0

@Pavan检查[这里](http://stackoverflow.com/questions/17622556/scanner-method-opened-and-closed-twice) – sam

-1

我固定它通过scanner.nextLine()

这是我在PizzaOrder类代码替换scanner.close()

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$