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ượng và tham 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 x
và y
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.
Cảm ơn bạn @Jon Skeet, câu trả lời của bạn thực sự hữu ích! – Hazmat