1

このコード セグメントから null 例外エラーが発生しましたが、原因がわかりません。配列 itemcatalog には、i =0 から 8 のデータが取り込まれています。私は Java を初めて使用するので、どんな支援も大歓迎です。エラー メッセージは、while ステートメントの行を指しています。ありがとう

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());
}
4

3 に答える 3

2

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.
于 2012-10-17T20:13:24.760 に答える
0

ループをどのように終了しますか?ループはiが10になるまで続くようです。そうすると、制限を超えてしまいます。

これが配列を使用する必要がある単一の割り当てでない限り、配列ではなくマップを使用することもお勧めします。このようにして、コレクションに100,000エントリがあるか、10エントリがあるかに関係なく、ルックアップは同じ時間になります。

また、NPEまたはArrayOutOfBounds例外のリスクを軽減します

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/HashMap.htmlを参照してください

オブジェクトを追加するときは、アイテムコードをキーとして使用します。次に、キーで検索します。

マップを使用するコストは、メモリ使用量の増加です。

于 2012-10-17T20:14:52.153 に答える
0

コメントから、デザインが健全ではないことは明らかです。

考えられる解決策は次のとおりです。

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
}

これは、配列がitemCodeを持つitemCatalogsで正しく満たされていることを前提としています。

于 2012-10-17T20:15:02.203 に答える