Aplicação Java para carrinho de compras (addToCart)

estou a fazer uma aplicação Java para uma classe e preciso de ajuda com os erros que estão a surgir após a execução da aplicação.

o aplicativo deve permitir que o usuário adicione um item ao carrinho de compras(nome do item, preço, quantidade). O item descrito pelo Usuário será adicionado ao carrinho de compras, e então ele será impresso uma vez que ele é adicionado com sucesso.

o carrinho de compras tem uma capacidade máxima de 5 itens inicialmente, mas se o tamanho do carrinho for > 5, será aumentado + 3, via o método do aumento.

como indicado abaixo, acredito que o método addToCart não é adicionar o item descrito pelo utilizador ao carrinho. É por isso que é um valor nulo dentro do método de toString.

Então, basicamente preciso de ajuda com o método addToCart. Por favor, corrija-me se estiver errado. Obrigado.

o resultado da execução da aplicação é o seguinte:

run:
Enter the name of the item: a
Enter the unit price: 2
Enter the quantity: 2
Exception in thread "main" java.lang.NullPointerException
    at shop.ShoppingCart.toString(ShoppingCart.java:62)
    at java.lang.String.valueOf(String.java:2854)
    at java.io.PrintStream.println(PrintStream.java:821)
    at shop.Shop.main(Shop.java:49)
Java Result: 1
Abaixo está a classe ShoppingCart.

o método de toString não deve ter quaisquer erros a ser produzido, mas eu acredite que o problema está dentro do método addToCart.

// **********************************************************************
//   ShoppingCart.java
//
//   Represents a shopping cart as an array of items
// **********************************************************************
import java.text.NumberFormat;

public class ShoppingCart
{

    private Item[] cart;
    private int itemCount;      // total number of items in the cart
    private double totalPrice;  // total price of items in the cart
    private int capacity;       // current cart capacity

    // -----------------------------------------------------------
    //  Creates an empty shopping cart with a capacity of 5 items.
    // -----------------------------------------------------------
    public ShoppingCart()
    {

      capacity = 5;
      cart = new Item[capacity];
      itemCount = 0;
      totalPrice = 0.0;
    }

    // -------------------------------------------------------
    //  Adds an item to the shopping cart.
    // -------------------------------------------------------
    public void addToCart(String itemName, double price, int quantity)
    { 

        Item temp = new Item(itemName, price, quantity);
        totalPrice += (price * quantity);
        itemCount += quantity;
        cart[itemCount] = temp;
        if(itemCount==capacity)
        {
            increaseSize();
        }
    }

    // -------------------------------------------------------
    //  Returns the contents of the cart together with
    //  summary information.
    // -------------------------------------------------------
    public String toString()
    {
      NumberFormat fmt = NumberFormat.getCurrencyInstance();

      String contents = "\nShopping Cart\n";
      contents += "\nItem\t\tUnit Price\tQuantity\tTotal\n";

      for (int i = 0; i < itemCount; i++)
          contents += cart[i].toString() + "\n";

      contents += "\nTotal Price: " + fmt.format(totalPrice);
      contents += "\n";

      return contents;
    }

    // ---------------------------------------------------------
    //  Increases the capacity of the shopping cart by 3
    // ---------------------------------------------------------
    private void increaseSize()
    {
        Item[] temp = new Item[capacity+3];
        for(int i=0; i < capacity; i++)
        {
            temp[i] = cart[i];
        }
        cart = temp; 
        temp = null;
        capacity = cart.length;
    }
}

abaixo está a Loja principal.

a lista não está em uso neste momento, mas será mais tarde quando os erros de toString forem corrigidos.

package shop;

// ***************************************************************
//   Shop.java
//
//   Uses the Item class to create items and add them to a shopping
//   cart stored in an ArrayList.
// ***************************************************************

import java.util.ArrayList;
import java.util.Scanner;

public class Shop
{
    public static void main (String[] args)
    {
      ArrayList<Item> cart = new ArrayList<Item>();

      Item item;
      String itemName;
      double itemPrice;
      int quantity;

      Scanner scan = new Scanner(System.in);

      String keepShopping = "y";
      ShoppingCart cart1 = new ShoppingCart();
      do
          {
            System.out.print ("Enter the name of the item: ");
            itemName = scan.next();

            System.out.print ("Enter the unit price: ");
            itemPrice = scan.nextDouble();

            System.out.print ("Enter the quantity: ");
            quantity = scan.nextInt();

            // *** create a new item and add it to the cart
            cart1.addToCart(itemName, itemPrice, quantity);



            // *** print the contents of the cart object using println
            System.out.println(cart1);

            System.out.print ("Continue shopping (y/n)? ");
            keepShopping = scan.next();
          }
      while (keepShopping.equals("y"));

    }
}

abaixo está a classe de itens:

package shop;

// ***************************************************************
//   Item.java
//
//   Represents an item in a shopping cart.
// ***************************************************************

import java.text.NumberFormat;

public class Item
{
    private String name;
    private double price;
    private int quantity;

    // -------------------------------------------------------
    //  Create a new item with the given attributes.
    // -------------------------------------------------------
    public Item (String itemName, double itemPrice, int numPurchased)
    {
      name = itemName;
      price = itemPrice;
      quantity = numPurchased;
    }

    // -------------------------------------------------------
    //   Return a string with the information about the item
    // -------------------------------------------------------
    public String toString ()
    {
      NumberFormat fmt = NumberFormat.getCurrencyInstance();

      return (name + "\t" + fmt.format(price) + "\t" + quantity + "\t"
            + fmt.format(price*quantity));
    }

    // -------------------------------------------------
    //   Returns the unit price of the item
    // -------------------------------------------------
    public double getPrice()
    {
      return price;
    }

    // -------------------------------------------------
    //   Returns the name of the item
    // -------------------------------------------------
    public String getName()
    {
      return name;
    }

    // -------------------------------------------------
    //   Returns the quantity of the item
    // -------------------------------------------------
    public int getQuantity()
    {
      return quantity;
    }
} 
Author: JRW2252, 2013-08-27

3 answers

Acho que o problema é causado por estas duas linhas de addToCart():
itemCount += quantity;
cart[itemCount] = temp;
A menos que quantity Seja 0, isto significa que cart[0] nunca irá conter nada. De fato, qualquer que seja o valor de quantity, você estará deixando tantas lacunas em cart (por exemplo, se quantity é 2, cart[0] e cart[1] será nulo).

Uma vez que um {[12] } já inclui a quantidade, creio que querias fazer isto:

cart[itemCount] = temp;
itemCount += 1;
Assim o primeiro item será colocado em cart[0], o segundo em cart[1], e assim no.

Outro pequeno conselho: se você está concatenando qualquer objeto com uma cadeia de caracteres, você não precisa chamar toString() sobre o objeto. O Java irá ligar automaticamenteString.valueOf() no objeto, que evita um NullPointerException Porque devolve a cadeia "null" em vez disso. Neste caso, ele pode ter ajudado você a depurar o problema porque você teria notado a String nula aparecendo em sua saída. Teria de mudar o seu código para o seguinte:

for (int i = 0; i < itemCount; i++)
    contents += cart[i] + "\n";
 2
Author: andersschuller, 2013-08-27 19:06:55
public void addToCart(String itemName, double price, int quantity)
{ 

    Item temp = new Item(itemName, price, quantity);
    totalPrice += (price * quantity);
    itemCount += quantity;
    cart[itemCount] = temp;
    if(itemCount==capacity)
    {
        increaseSize();
    }
}
Este código está quebrado. Você tenta adicionar a carrinho no índice itemCount . Isto irá expulsar o index dos executions encadernados. basicamente você aumenta o tamanho do seu carrinho até tarde. Isto também causa muitos lugares vazios na sua matriz. Você não adiciona seu próximo Item no próximo lugar do seu arra, mas você salta Quantidade lugares à frente. Isto faz com que alguns dos valores no seu array sejam null . Isto está a causar NullPointerExceütionin toString().

Para como implementar esta lista de auto-crescimento. Talvez queiras dar uma vista de olhos à lista de alunos que vem com o JDK.

Há outros pontos que quero salientar:
  • google javaDoc e use-o em vez dos seus próprios comentários personalizados
  • substitua o seu para-loop em toString () por um para-cada loop
 1
Author: Tobias Kremer, 2013-08-27 19:09:33

O problema está no seu método addToCart. Se escrever este código:

ShoppingCart shopcart= new ShoppingCart();
shopcart.addToCart("foo", 3, 2);

O carrinho de compras terá os seguintes atributos:

totalPrice=6
itemCount = 2;
cart = { null, null, foo, null, null};

O problema é que o addToCart só modifica o elemento "itemcount" do array cart sem considerar o número de elemento adicionado. Além disso, a cart[0] ficará em null para sempre. Devias refazer estas linhas. itemCount + = quantidade; cart [itemCount] = temp;

Por

for ( int i =0 ; i<quantity;i++)
{
     cart[itemCount+i] = temp;
} 
itemCount += quantity;
 0
Author: Julien, 2013-08-27 18:58:12