2010-10-28 33 views
9

Tại sao String.valueOf (null) gây ra ngoại lệ con trỏ null? Trường hợp hành vi mong đợi là trả về chuỗi "null".Tại sao String.valueOf (null) gây ra ngoại lệ con trỏ null?

String x = null; 
    System.out.println(String.valueOf(x)); 

Điều này cho chuỗi "rỗng". nhưng

System.out.println(String.valueOf(null)); 

sẽ gây ra ngoại lệ con trỏ null.

Trả lời

18

String.valueOf(null) chọn phương thức quá tải với đối số char[] và sau đó không thành công trong hàm tạo new String(null). Lựa chọn này được thực hiện tại thời gian biên dịch.

Nếu bạn muốn sử dụng một cách rõ ràng phương pháp quá tải với một Object lập luận, sử dụng:

String.valueOf((Object) null) 

Lưu ý rằng không có phương pháp quá tải tham gia một cuộc tranh luận String - một trong những viện dẫn trong trường hợp đầu tiên được tham gia Object.

Để trích dẫn JLS:

15.12.2 Compile-Time Bước 2: Xác định phương pháp Chữ ký

Bước thứ hai tìm kiếm kiểu xác định trong bước trước cho các phương pháp thành viên. Bước này sử dụng tên của phương thức và các kiểu của các biểu thức đối số để định vị các phương thức có thể truy cập và áp dụng được, đó là các khai báo có thể được gọi đúng trên các đối số đã cho. Có thể có nhiều phương pháp như vậy, trong trường hợp đó, phương pháp cụ thể nhất được chọn. Bộ mô tả (chữ ký cộng với kiểu trả về) của phương thức cụ thể nhất là phương thức được sử dụng trong thời gian chạy để thực hiện phương thức gửi.

Tất cả các phương pháp được áp dụng, vì vậy chúng tôi đi đến:

15.12.2.5 Chọn Phương pháp cụ thể nhất

Nếu có nhiều hơn một phương pháp thành viên vừa tiếp cận và áp dụng đối với một lời gọi phương thức, cần phải chọn một phương thức để cung cấp bộ mô tả cho việc gửi 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 pháp cụ thể nhất được chọn.

Trực giác không chính thức là một phương pháp cụ thể hơn phương pháp khác nếu bất kỳ lời gọi nào được xử lý bằng phương pháp đầu tiên có thể được truyền sang phương thức khác mà không có lỗi loại biên dịch.

Nhờ polygenelubricants - chỉ có hai phương pháp quá tải chấp nhận một đối tượng - char[]Object-char[] là cụ thể nhất.

+0

null phải được coi là đối tượng. tại sao nó được coi là char []? – Sujith

+3

@Sujith: Bởi vì 'char []' * là * một đối tượng – skaffman

+0

@Sujith bạn đang sử dụng nhật thực, hay javac? – Bozho

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