Java 数组中的空指针异常
我从这段代码中得到一个空异常错误,我不确定是什么导致了它。已填充i=0到8的数组itemcatalog。我是java新手,因此非常感谢您的帮助。错误消息指向while语句的行。谢谢Java 数组中的空指针异常,java,Java,我从这段代码中得到一个空异常错误,我不确定是什么导致了它。已填充i=0到8的数组itemcatalog。我是java新手,因此非常感谢您的帮助。错误消息指向while语句的行。谢谢 public class ItemCatalog { private static ItemCatalog instance = new ItemCatalog(); private Item itemCatalog[] = new Item[9]; private ItemCatalog()
public class ItemCatalog {
private static ItemCatalog instance = new ItemCatalog();
private Item itemCatalog[] = new Item[9];
private ItemCatalog(){
};
public static synchronized ItemCatalog getInstance() {
return instance;
}
public void populateCatalog()
{
itemCatalog[0] = new Item("bb","Baked Beans",new BigDecimal("0.35"));
itemCatalog[1] = new Item("cf","Cornflakes",new BigDecimal("1.00"));
itemCatalog[2] = new Item("s0","Sugar",new BigDecimal("0.50"));
itemCatalog[3] = new Item("tb","Tea Bags",new BigDecimal("1.15"));
itemCatalog[4] = new Item("ic","Instant Coffee",new BigDecimal("2.50"));
itemCatalog[5] = new Item("b0","Bread",new BigDecimal("0.50"));
itemCatalog[6] = new Item("s0","Sausages",new BigDecimal("1.30"));
itemCatalog[7] = new Item("e0","Eggs",new BigDecimal("0.75"));
itemCatalog[8] = new Item("m0","Milk",new BigDecimal("0.65"));
}
public BigDecimal getPrice(String itemCode)
{
int i = 0;
while (!itemCode.equals(itemCatalog[i].getItemCode()))
{
i++;
}
BigDecimal itemPrice = itemCatalog[i].getItemprice();
return itemPrice;
}
}
我解决了这个问题。我在主类中填充目录,它给出了null异常错误。我在jframe中实例化了它,它可以正常工作。下面的代码解决了这个问题,但这是填充目录的最佳位置吗
private void saleButtonActionPerformed(java.awt.event.ActionEvent evt) {
String itemCode = this.itemCodeinput.getText();
int itemQuantity =Integer.parseInt(this.itemQuantityinput.getText());
ItemCatalog catalog = ItemCatalog.getInstance();
catalog.populateCatalog();
BigDecimal price = catalog.getPrice(itemCode);
itemCostoutput.setText(price.toString());
}
如果您的itemCode与itemCatalog中的任何条目都不匹配,那么最终
while (!itemCode.equals(itemCatalog[i].getItemCode()))
{
i++;
}
将i增加到11,在这种情况下,itemCatalog[11]为空或超出范围
如果添加,则应使用for循环来迭代itemCatalog:
for (int i = 0; i < itemCatalog.length; i++) {
if (itemCode.equals(itemCatalog[i].getItemCode()) {
return (BigDecimal) itemCatalog[i].getItemprice();
}
}
return null // you can change this from null to a flag
// value for not finding the item.
for(int i=0;i
如何结束循环?
似乎循环将一直持续到我10岁。那么你的循环将超过限制
除非这是一个uni分配,您必须使用数组,否则我还建议使用映射,而不是数组。这样,无论您的集合有100000个条目还是10个条目,您的查找都将是相同的
您还将降低NPE或边界排列异常的风险
看
添加对象时,使用项代码作为键。然后按键进行查找
使用地图的成本是增加内存使用。从评论中可以看出,该设计显然不合理 下面是一个可能的解决方案:
public BigDecimal getPrice(String itemCode) {
for (int i=0; i<itemCatalog.length; i++) { // not going outside the array
if (itemCatalog[i].getItemCode().equals(itemCode)) { // inversing the test to avoid npe if itemCode is null
return itemCatalog[i].getItemprice();
}
}
return null; // default value
}
public-BigDecimal-getPrice(String-itemCode){
对于(int i=0;i放置完整堆栈跟踪。这将很有帮助。您确定传递的itemCode不为null吗?itemCode
为null,或者itemCatalog[i]
为空。关于堆栈跟踪:告诉我们错误的行在哪里。您应该使用for
循环和itemcalog.length
。还要注意原始注释:他是从1到10填充的。不能保证itemcalog[0]不是空的。这是一个很好的观点,我只是假设他指的是前10项,而没有考虑到他可能在实现中跳过了0。非常感谢到目前为止所有人的评论。我用for循环更改了while循环,并且在if语句行仍然得到一个空点异常。