Vấn đề là String.valueOf
phương pháp đó bị quá tải :
Ngôn ngữ đặc tả Java yêu cầu rằng trong các loại trường hợp này, quá tải cụ thể nhất được chọn:
Nếu có nhiều hơn một phương thức thành viên có thể truy cập và áp dụng được cho một lời gọi phương thức, thì cần phải chọn một phương thức để cung cấp bộ mô tả cho công văn phương thức thời gian chạy. Ngôn ngữ lập trình Java sử dụng quy tắc mà phương thức cụ thể nhất được chọn.
A char[]
là-an Object
, nhưng không phải tất cả Object
là-a char[]
. Vì vậy, char[]
là cụ thể hơn so với Object
, và theo quy định của ngôn ngữ Java, String.valueOf(char[])
tình trạng quá tải đã được chọn trong trường hợp này.
String.valueOf(char[])
hy vọng mảng không phải là null
, và vì null
được đưa ra trong trường hợp này, nên nó sẽ ném NullPointerException
.
Cách "khắc phục" dễ dàng là chuyển null
một cách rõ ràng Object
như sau:
System.out.println(String.valueOf((Object) null));
// prints "null"
Câu hỏi liên quan
Đạo đức của câu chuyện
Có một vài điều quan trọng:
- Phiên bản Java 2 hiệu quả, Mục 41: Sử dụng quá tải một cách thận trọng
- Chỉ vì bạn có thể quá tải, không có nghĩa là bạn nên mỗi lần
- Chúng có thể gây nhầm lẫn (đặc biệt là nếu các phương thức làm những việc cực kỳ khác nhau)
- Sử dụng IDE tốt, bạn có thể kiểm tra quá tải nào được chọn tại thời điểm biên dịch
- Với Eclipse, bạn có thể di chuột qua biểu thức trên và thấy rằng thực sự ,
valueOf(char[])
quá tải đã được chọn!
- Đôi khi bạn muốn phân phát rõ ràng
null
(ví dụ để làm theo)
Xem thêm
Đang đúc null
Có ít nhất hai tình huống trong đó việc truyền rõ ràng null
đến một loại tham chiếu cụ thể là cần thiết:
- Để chọn quá tải (như trong ví dụ trên)
- Để cung cấp
null
dưới dạng một đối số cho một tham số vararg
Một ví dụ đơn giản về sau là như sau:
static void vararg(Object... os) {
System.out.println(os.length);
}
Sau đó, chúng ta có thể có những điều sau đây:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Xem thêm
Câu hỏi liên quan
null
trong trường hợp này), hãy đảm bảo rằng cả hai quá tải đều hoạt động như nhau đối với giá trị đó!