2011-01-08 27 views
9

Tôi chỉ bắt đầu với java và tôi đang cố gắng để tạo ra một mảng các đối tượng lớp Dog và tôi nhận được lỗi này:java.lang.NullPointerException

Exception in thread "main" java.lang.NullPointerException

tại dòng này:

Dog[] dogsList = new Dog[7]; 
dogsList[4].setSize(4); 

Trả lời

24

Khi bạn tạo một mảng, đó là một loạt các tài liệu tham khảo - và bước đầu tất cả những tài liệu tham khảo là null, vì vậy họ đang không đề cập đến bất kỳ trường của Dog. Bạn cần phải tạo một thể hiện, như thế này:

Dog[] dogsList = new Dog[7]; 
dogsList[4] = new Dog(); 
dogsList[4].setSize(4); 

Ngoài ra, bạn đã có thể có một tham chiếu đến một Dog từ nơi khác:

Dog fido = new Dog(); 
// Other code here 

dogsList[4] = fido; 
dogsList[4].setSize(4); 

Một nền ít

Một trong những điều quan trọng nhất cần hiểu là sự khác biệt giữa các đối tượng đối tượngtham chiếu. Tham chiếu là một cách để tới một đối tượng - và nhiều tham chiếu có thể tham chiếu đến cùng một đối tượng. Ví dụ:

Dog x = new Dog(); 
Dog y = x; 

x.setName("Fido"); 
System.out.println(x.getName()); // Will print "Fido" 

Ở đây, giá trị của các biến xy không chó ... họ đang tham khảo để chó (hoặc null, mà tôi sẽ đi lên trong một phút). Dòng

Dog y = x; 

đặt giá trị ban đầu của y với giá trị của x - vì vậy hai biến tham khảo cùng một đối tượng Dog.

Bây giờ null là giá trị tham chiếu đặc biệt không tham chiếu đối tượng. Một NullPointerException bị ném nếu bạn cố gắng dereference tham chiếu không có giá trị (thường là với toán tử ., nhưng cũng có những thứ như lập chỉ mục mảng).

Mảng

Khi bạn tạo một mảng, tất cả các yếu tố được ngay lập tức dân cư với giá trị mặc định cho các loại. Đối với các loại số 0, đối với boolean là sai và đối với char ký tự của nó 0. Đối với bất kỳ loại tham chiếu (lớp) nào là tham chiếu null.Vì vậy, khi bạn làm điều này:

Dog[] dogsList = new Dog[7]; 

đó là tương đương với:

Dog[] dogsList = { null, null, null, null, null, null, null }; 

Vì vậy, trong mã ban đầu của bạn, giá trị của dogsList[4] là null. Sau đó bạn cố gắng dereference rằng tham chiếu null để gọi setSize trên đối tượng tham chiếu ... và bang! Bạn nhận được NullPointerException.

Có rất nhiều khái niệm thực sự quan trọng liên quan đến câu hỏi này, vì vậy, vui lòng hỏi thêm chi tiết về bất kỳ điểm cụ thể nào.

+0

Cảm ơn bạn @Jon Skeet, câu trả lời của bạn thực sự hữu ích! – Hazmat

2

Bạn cố gắng gọi setSize trên giá trị null. Bạn cần tạo đối tượng Dog mới và đặt tham chiếu đến đối tượng đó trong ô của mảng này.

Dog[] dogsList = new Dog[7]; 
dogList[4] = new Dog(); 
dogsList[4].setSize(4); 
3

Bạn đã khởi tạo mảng để giữ Chó. Bạn đã không khởi tạo các đối tượng trong mảng.

Vì vậy

Dog[] dogList = new Dog[7]; 
dogList[4] = new Dog(); 
dogList[4].setSize(4); 
1

Các bài viết khác cũn đúng (không ý định chơi chữ;), vì vậy tôi sẽ cung cấp cho bạn phương pháp khác để instantiating đối tượng Dog của bạn.

Như đã đề cập, mã của bạn không điền vào một mảng mới với 7 đối tượng Dog, mà là tạo một mảng có kích thước 7 bắt đầu có chứa tham chiếu null. Các tài liệu tham khảo có thể này được chỉ cho các phiên bản mới của Chó, nhưng không phải cho đến khi bạn làm như vậy theo cách thủ công.

Vì vậy, để lấp đầy mảng của bạn với các đối tượng Dog mới (mà dường như là ý định ban đầu của bạn), chúng ta hãy thử điều này:

  1. Tạo mảng (như bạn đã làm)
  2. Lặp qua mảng và tạo các đối tượng Dog mới trong mỗi "khe"
  3. Tiếp cận một trong những Chó trong mảng và gọi phương thức setSize()

Dog[] dogsList = new Dog[7]; 

for(int i=0; i<dogsList.length; i++) { 
    dogsList[i] = new Dog(); 
} 

//will work because each slot in dogsList now points to a Dog instance 
dogsList[4].setSize(4); 

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