我正在为一个类做一个Java应用程序,需要帮助解决运行应用程序后出现的错误。
该应用程序应允许用户将商品添加到购物车(商品名称,价格,数量)。用户描述的项目将添加到购物车阵列中,然后在成功添加后将打印出来。
购物车最初的最大容量为5件,但如果购物车的尺寸为> 5,通过increaseSize方法增加+3。
如下所述,我认为addToCart方法不会将用户描述的项目添加到购物车。这就是为什么它在toString方法中是一个空值。
所以,我基本上需要addToCart方法的帮助。 如果我错了,请纠正我。谢谢。
运行应用程序的输出如下:
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
以下是ShoppingCart Class。
toString方法不应该产生任何错误,但我相信问题在于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;
}
}
以下是Shop Main。
此时ArrayList尚未使用,但稍后将更正toString错误。
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"));
}
}
以下是项目类:
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;
}
}
答案 0 :(得分:2)
我认为问题是由addToCart()
的这两行引起的:
itemCount += quantity;
cart[itemCount] = temp;
除非quantity
为0
,否则cart[0]
将永远不会包含任何内容。事实上,无论quantity
的价值如何,您都会在cart
中留下许多空白(例如quantity
为2,cart[0]
和cart[1]
将是空)。
由于Item
已包含数量,我相信您打算这样做:
cart[itemCount] = temp;
itemCount += 1;
这样,第一项将放在cart[0]
中,第二项放在cart[1]
中,依此类推。
另一小段建议:如果您使用String连接任何对象,则无需在对象上调用toString()
。 Java将自动在对象上调用String.valueOf()
,这样可以避免NullPointerException
,因为它会返回字符串"null"
。在这种情况下,它可能帮助您调试问题,因为您会注意到输出中出现的null String。您必须将代码更改为以下内容:
for (int i = 0; i < itemCount; i++)
contents += cart[i] + "\n";
答案 1 :(得分:1)
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();
}
}
此代码已损坏。您尝试在索引 itemCount 处添加 cart 。这将使索引超出绑定的execptions。基本上你将购物车的尺寸增加到很晚。
这也会导致数组中的空位很多。你没有在arra的下一个地方添加你的下一个 Item ,但是你可以向前跳过 quantity 。这会导致数组中的某些值为 null 。这最有可能导致 toString()中的NullPointerExceütion。
如何实现这个自我增长的列表。您可能想要查看JDK附带的类ArrayList。
我想指出其他一些观点:
答案 2 :(得分:0)
问题在于你的addToCart方法。 如果您输入以下代码:
ShoppingCart shopcart= new ShoppingCart();
shopcart.addToCart("foo", 3, 2);
购物车将具有以下属性:
totalPrice=6
itemCount = 2;
cart = { null, null, foo, null, null};
问题是addToCart只修改数组cart
的“itemcount”元素而不考虑添加的元素数量。
而且,cart [0]将永远保持为null。
你应该重新考虑这些线
itemCount + =数量;
cart [itemCount] = temp;
通过
for ( int i =0 ; i<quantity;i++)
{
cart[itemCount+i] = temp;
}
itemCount += quantity;