2009-04-09 32 views
13

Đoạn mã sau đây cho tôi NullPointerException. Vấn đề là trên dòng sau:NullPointerException trong khi sử dụng phương thức put của HashMap

... 
dataMap.put(nextLine[0], nextLine[6]); 

gì là lạ là tôi đã chạy mã này mà không có dòng trên và các cuộc gọi đến nextLine[0]nextLine[6] làm việc chính xác như mong đợi - đó là họ cung cấp cho tôi trở lại các yếu tố của một tệp csv. Tôi tuyên bố và khởi tạo HashMap với mã

HashMap<String, String> dataMap = null; 

trước đó trong phương pháp

String[] nextLine; 
    int counter=0; 
    while (counter<40) { 
    counter++; 

    System.out.println(counter); 
    nextLine = reader.readNext(); 
    // nextLine[] is an array of values from the line 
    System.out.println(nextLine[0] + " - " + nextLine[6] +" - " + "etc..."); 
    dataMap.put(nextLine[0], nextLine[6]); 
    } 
    return dataMap; 
} 

Trả lời

26
HashMap<String, String> dataMap = new HashMap<String,String>(); 

Biến số dataMap của bạn không được khởi tạo tại thời điểm này. Bạn nên nhận được một cảnh báo trình biên dịch về điều đó.

+0

Không phải là vấn đề thực sự rằng nó * được * khởi tạo rõ ràng? Để null? –

+0

Tôi nghĩ rằng Codingscape có nghĩa là để nói "không phải là instantiated" –

+0

Trên thực tế, có một gợi ý ở đây. Anh ta không nhận được cảnh báo bởi vì anh ta đã khởi tạo nó thành null để ghi đè lên cảnh báo trình biên dịch mà anh ta chắc chắn đang nhận được. Bạn nên làm cho nó một thói quen KHÔNG để khởi tạo biến thành giá trị "Trung lập" theo mặc định, chỉ đặt chúng thành giá trị thực của chúng để trình biên dịch có thể cảnh báo. –

5

đâu datamap khởi? Nó luôn luôn rỗng.

Để làm rõ, bạn khai báo biến và đặt biến thành rỗng. Nhưng bạn cần phải tạo một Bản đồ mới, cho dù đó là một HashMap hay tương tự.

ví dụ:

datamap = new HashMap(); 

(bỏ qua một bên Generics, vv)

+0

Có, rất kỳ lạ rằng dereferencing một con trỏ rõ ràng là null sẽ ném NullPointerException. – Apocalisp

3

dataMap được khai báo nhưng không được khởi tạo. Nó có thể được khởi tạo với

datamap = new HashMap();

1

Vâng, có ba đối tượng được truy cập trên dòng đó. Nếu nextLine [0] và nextLine [6] không phải là null, bởi vì cuộc gọi println ở trên đã hoạt động, thì lá dữ liệu lại bị bỏ qua. Bạn đã làm dataMap = new HashMap(); somwehere?

0

Um, chính xác những gì làm bạn mong đợi khi bạn làm điều này?

HashMap<String, String> dataMap = null; 
... 
dataMap.put(...) 
+2

Tôi đã mong đợi rằng null là loại một nơi giữ, nhưng khi bạn sử dụng đặt giá trị được "đặt" làm cho HashMap không còn bằng null – Ankur

+0

Nếu put = null ở khắp mọi nơi chương trình của tôi sẽ tự viết? –

Các vấn đề liên quan