2013-07-02 40 views
5

Tôi có hai hashmapsHashMap được trả về NULL

HashMap<Integer, Integer> inventoryRequirements = new HashMap<Integer, Integer>(); 
HashMap<Integer, Integer> inventory = new HashMap<Integer, Integer>(); 

Tôi có một vòng lặp để kiểm tra hiện tại và thêm vào đó:

for(Item item : items){ 
    int currentRequirement = 0; 
    currentRequirement = inventoryRequirements.get(item.get_id()); 
    inventoryRequirements.put(item.get_id(), currentRequirement++);   
} 

Tôi có một vòng lặp để kiểm tra hàng tồn kho và thêm vào đó:

for(Item item : items){ 
    int currentInventory = 0; 
    // this next line returns null 
    currentInventory = inventory.get(item.get_id()); 
    inventory.put(item.get_id(), currentInventory++);   
} 

Cái đầu tiên hoạt động tốt, nhưng pukes thứ hai và trả về giá trị rỗng. Tôi không hiểu tại sao cái thứ hai không hoạt động. Cả hai đều ở trạng thái giống như được mô tả trong mẫu mã.

EDIT

Hai HM được dân cư như bạn thấy ở đây - thực sự! Tôi biết nó có thể khó tin nhưng cái đầu tiên hoạt động và cái thứ hai thì không.

+7

Bạn đã bao giờ 'đặt' bất kỳ thứ gì vào 'khoảng không quảng cáo' chưa? Ngoài ra, tại sao không sử dụng 'Bản đồ ' s? – Jeffrey

+2

Nếu 'inventoryRequirements' bắt đầu trống, vòng lặp đầu tiên cũng sẽ không thành công. – Joni

+0

Nó không bao giờ được đưa vào hàng để đưa bất cứ thứ gì vào đó. Về lý do tại sao Bản đồ không thay thế - tôi không có câu trả lời hay cho điều đó - có lợi thế thực sự không? –

Trả lời

1

Nếu mã bạn đã cung cấp hoàn tất, thì bạn chưa đặt bất kỳ thứ gì vào số hashmap của mình. Vì vậy, nó sẽ luôn trả về null.

+0

True !! Nhưng trong trường hợp đó tôi tự hỏi rằng tại sao đoạn mã đầu tiên đang chạy tốt ??? – PVR

+0

Đó là không đúng sự thật. Vòng lặp 'foreach' sẽ không lặp lại trên' HashMap', nếu như vậy là một trường hợp. – Lion

+0

Bằng cách nào ?? Foreach loop đang được lặp lại trong danh sách .. Tôi dint giúp bạn tại sao nó thất bại .. – PVR

0

Bạn đang nhận được một mục từ inventory nhưng nó trống

10

Cả hai vòng bạn hiển thị sẽ ném một NullPointerException (NPE) nếu chìa khóa mà bạn yêu cầu qua get() không nằm trong Map.

Map.get() trả về null khi không có khóa (hoặc tất nhiên nếu giá trị được lưu với khóa đó là null). An Integer (loại hộp tự động) là null không thể được tự động phát vào một số int để nó ném một NPE.

Cách an toàn thực hiện này là:

for (Item item : items) { 
    Integer currentRequirement = inventoryRequirements.get(item.get_id()); 
    if (currentRequirement != null) { 
     inventoryRequirements.put(item.get_id(), currentRequirement++);   
    } 
} 

Tất nhiên, nó cũng hoàn toàn có thể là bạn có một Item trong bộ sưu tập của bạn mà là nullrằng là những gì là ném NPE.

+0

+1 cho điểm cuối cùng của bạn, nhưng anh ta nói rằng nó trả về null và không ném null, nhưng điều đó cũng không có ý nghĩa vì nó là 'int'. –

+0

Nếu 'get()' trả về 'null' nó ném. Hoặc, JVM/máy tính của anh ấy bị hỏng;) Tôi đang nghiêng về phía một 'Item' là 'null', bản thân mình. –