-1

I have two classes: Pizza and PizzaOrder. PizzaOrder allow for user create a new order with 1-3 pizzas in his's order. After input the number of Pizza, It will continue to input the information of each pizza. But I have error with Scanner, I can't not input anymore after input the number of Pizza.

Here is my code:

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

class 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() +"$");
    }
}

When I input the number of Pizza == 1 in PizzaOrder class, it show error:

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)

How to solve this?

Twitter khuong291
  • 11,328
  • 15
  • 80
  • 116

4 Answers4

1

You should first create Pizza instances and then access it's member functions like pizza.setSize in enterInformation

In each if statement you can;

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

Also you already has pizzaOrder.numPizzas in setNumPizzas so passing it again is redundant ;

pizzaOrder.setNumPizzas(pizzaOrder.numPizzas);

I suggest you to use array for multiple Pizza instances.

Fatih Donmez
  • 4,319
  • 3
  • 33
  • 45
  • I did the same as you but it show error: Enter the number of Pizza: 1 -----------Enter Pizza1's Information-----------Exception in thread "main" Enter the pizza's size: java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Scanner.java:1585) at bai2.PizzaOrder.enterInformation(PizzaOrder.java:56) at bai2.PizzaOrder.setNumPizzas(PizzaOrder.java:31) at bai2.PizzaOrder.main(PizzaOrder.java:10) – Twitter khuong291 Nov 02 '15 at 13:45
  • first check if(scanner.hasNextLine()) and then call nextLine – Fatih Donmez Nov 02 '15 at 13:47
0

You shouldn't use multiple instances of Scanner wrapping the input stream System.in, because once you close it, it is not supposed to be used again.

Instead declare a single instance of Scanner with System.in. You can declare a Utils class holding a global instance of scanner. Or just put a public static instance of Scanner in either Pizza or PizzaOrder. - As long as it is accessible globally, either way works.

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

Use as

InputUtil.scanner.nextInt();
Bon
  • 3,073
  • 5
  • 21
  • 40
0

Along with not initializing instances of pizza1,2,3, problem is that you are closing stream

Here

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

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

Then from setNumPizza which calls enterInformation

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

Once you call scanner.close, it will close the underlying stream. Create a single instance

sam
  • 2,033
  • 2
  • 10
  • 13
-1

I fixed it by replace scanner.close() by scanner.nextLine()

Here is my code in PizzaOrder class:

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() +"$");
    }
}

The output:

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$
Twitter khuong291
  • 11,328
  • 15
  • 80
  • 116