2010-01-14 55 views
5

Là một nhà phát triển, chúng ta thường gặp phải ngoại lệ rằng: NullReferenceException với thông báo lỗi nổi tiếng:Tại sao 'Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng' không mô tả chi tiết hơn?

Object tài liệu tham khảo không được đặt để một thể hiện của một đối tượng

Há chẳng phải có thể cho. NET framework để trả lại một cái gì đó có ý nghĩa hơn một chút?

Something như:

Object loại X có tên là Y không được đặt để một thể hiện của một đối tượng

Trả lời

15

Một đối tượng không có tên - vậy làm thế nào nó có thể cho bạn biết tên? Các tham chiếu null thể đã được nạp từ một biến - hoặc nó có thể đã được trả lại bằng một phương pháp, tài sản, vv

Các JIT có thể lẽ nhìn vào thông tin ngăn xếp để làm việc ra những gì các loại tài liệu tham khảo tuyên bố là , nhưng tôi không chắc chắn mức độ thường xuyên này sẽ giúp - và chắc chắn nó sẽ làm chậm mọi thứ. Tôi không thể nói rằng tôi từng thấy đây là một gánh nặng lớn khi nói đến gỡ lỗi - nếu có rất nhiều thứ có thể rỗng trên một dòng, điều đó thường gợi ý rằng nó đáng để chia chúng ra thành từng phần. Điều này có nghĩa là hơn.

+1

Nhờ dấu vết ngăn xếp cực kỳ chi tiết, tôi không nghĩ rằng nó cần phải chi tiết hơn. Thêm vào đó, họ thực sự nên sử dụng các xác nhận để tránh điều này ngay từ đầu. – ChaosPandion

+2

Mọi loại gỡ lỗi đều làm chậm mọi thứ. Tôi tự hỏi, mặc dù, nó sẽ làm chậm những thứ xuống * nhiều * so với bao nhiêu nó sẽ tăng tốc những thứ lên không phải quay trở lại và phá vỡ tất cả các đối tượng vào dòng riêng biệt, hoặc đi điên với cửa sổ ngay lập tức để tìm ra đối tượng nào là null? –

+0

Đồng ý rằng vấn đề này không phải là tất cả những gánh nặng. Một hoặc hai dòng trước khi một trong những trường hợp ngoại lệ tham chiếu null diễn ra sẽ cho bạn biết chính xác những gì không được khởi tạo. –

1

Bởi vì cách chung chung nhất của nó nói rằng.

2

Với tôi điều này có vẻ như hoàn toàn là một vấn đề ưu tiên. Nếu nó gây lỗi cho bạn nhiều, bạn luôn có thể phân lớp NullReferenceException và thay đổi thông báo. :)

Điều mặc dù là lượng thông tin có sẵn khi thông báo được tạo. Nếu không đi qua một cách thủ công trong một số thông tin bổ sung, chỉ cần xác định tên của trường là null bên trong NullReferenceException sẽ yêu cầu phản chiếu (có thể khá một chút), đó là một hoạt động khá nặng tải. Ví dụ: ArgumentNullException, để ném một trong đó thông báo cho biết tên thông số vi phạm, bạn phải chuyển một chuỗi khi bạn gọi nó: throw new ArgumentNullException("param1").

Mức độ chi tiết trong thông báo ngoại lệ hoàn toàn phụ thuộc vào lập trình viên xác định nó, nhưng thật thận trọng để tránh làm bất cứ điều gì hệ thống chuyên sâu khi ném ngoại lệ.

+0

Tôi khá chắc chắn rằng khung công tác ném NullReferenceException. – ChaosPandion

+0

Nó có, nhưng bạn luôn có thể 'try {} catch (NullReferenceException e) {ném new CoolerNullReferenceException (e)}' hoặc một số thứ như vậy. –

+0

Ah Tôi vừa nhận thấy nụ cười trong câu trả lời của bạn. :) – ChaosPandion

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