2009-04-22 89 views
118

Tôi nhận được lỗi này và tôi không chắc nó có ý nghĩa gì?"Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng" nghĩa là gì?

Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng.

+2

biết thêm thông tin vui lòng. – johnny

+9

Đây là "đèn kiểm tra động cơ" của lỗi .NET. Bạn thực sự cần phải chi tiết hơn khi cố gắng yêu cầu trợ giúp về SO. –

+1

Hầu như tất cả các trường hợp của 'NullReferenceException' đều giống nhau. Vui lòng xem "[NullReferenceException trong .NET là gì?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-in-net)" để biết một số gợi ý. –

Trả lời

12

Không thẳng thắn nhưng nó có nghĩa là chính xác những gì nó nói. Một trong các tham chiếu đối tượng của bạn là NULL. Bạn sẽ thấy điều này khi bạn thử và truy cập thuộc tính hoặc phương thức của đối tượng NULL'd.

+2

Anh ấy có thể làm ném NullReferenceException mới(); lol ... –

+8

Nó có nghĩa là chính xác những gì nó nói NẾU bạn biết những gì một đối tượng là, một tài liệu tham khảo và dụ ... tất cả các từ rất tải khi nói đến lập trình. –

+0

Jhonny - hahaha Tôi đoán bạn đang đúng – dkpatt

4

Điều đó có nghĩa là bạn đã làm điều gì đó như thế này.

Class myObject = GetObjectFromFunction(); 

mà không làm

if(myObject!=null), bạn đi trước làm myObject.Method();

1

gì lỗi này nghĩa là gì? Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng.

chính xác những gì nó nói, bạn đang cố gắng sử dụng một đối tượng rỗng như thể đó là đối tượng được tham chiếu đúng cách.

1

Hầu hết thời gian, khi bạn cố gắng assing giá trị vào đối tượng, và nếu giá trị là null, sau đó loại ngoại lệ xảy ra. Vui lòng kiểm tra this link.

vì mục đích tự học, bạn có thể đặt một số điều kiện kiểm tra. như

if (myObj== null) 
Console.Write("myObj is NULL"); 
114

Các biến trong .NET là loại tham chiếu hoặc loại giá trị. Các kiểu giá trị là các kiểu gốc như integersbooleans hoặc cấu trúc (và có thể được xác định bởi vì chúng kế thừa từ System.ValueType). biến Boolean, khi tuyên bố, có một giá trị mặc định:

bool mybool; 
//mybool == false 

loại tham khảo, khi tuyên bố, không có một giá trị mặc định:

class ExampleClass 
{ 
} 

ExampleClass exampleClass; //== null 

Nếu bạn cố gắng truy cập vào một thành viên của một trường lớp sử dụng một tham chiếu null sau đó bạn nhận được một System.NullReferenceException. Tương tự như Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng.

Các mã sau đây là một cách đơn giản để tái tạo này:

static void Main(string[] args) 
{ 
    var exampleClass = new ExampleClass(); 
    var returnedClass = exampleClass.ExampleMethod(); 
    returnedClass.AnotherExampleMethod(); //NullReferenceException here. 
} 

class ExampleClass 
{ 
    public ReturnedClass ExampleMethod() 
    { 
     return null; 
    } 
} 

class ReturnedClass 
{ 
    public void AnotherExampleMethod() 
    { 
    } 
} 

Đây là một lỗi rất phổ biến và có thể xảy ra vì tất cả các loại lý do. Nguyên nhân gốc thực sự phụ thuộc vào kịch bản cụ thể mà bạn đã gặp phải.

Nếu bạn đang sử dụng API hoặc gọi phương thức có thể trả về giá trị rỗng thì điều quan trọng là phải xử lý duyên dáng này.Phương pháp chính trên có thể được sửa đổi theo một cách như vậy mà NullReferenceException không bao giờ được nhìn thấy bởi một người dùng:

static void Main(string[] args) 
{ 
    var exampleClass = new ExampleClass(); 
    var returnedClass = exampleClass.ExampleMethod(); 

    if (returnedClass == null) 
    { 
     //throw a meaningful exception or give some useful feedback to the user! 
     return; 
    } 

    returnedClass.AnotherExampleMethod(); 
} 

Tất cả những điều trên thực sự chỉ là gợi ý của .NET Loại Fundamentals, để biết thêm thông tin tôi khuyên bạn nên một trong hai chọn CLR via C# hoặc đọc số MSDN article của cùng tác giả - Jeffrey Richter. Ngoài ra, hãy kiểm tra, phức tạp hơn nhiều, example khi bạn có thể gặp NullReferenceException.

Một số nhóm sử dụng Resharper sử dụng số JetBrains attributes để chú thích mã để đánh dấu vị trí mà giá trị rỗng được (không) mong đợi.

+1

Điều gì sẽ xảy ra nếu tôi có một danh sách bên trong một lớp khác, như sau: https://pastebin.com/aWhfu8UM. Tôi nhận được một 'ngoại lệ thời gian chạy (dòng 9): Tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng.' lỗi – Si8

+0

Vì thẻ là .net nhưng ngôn ngữ không được chỉ định, trong VB.Net, lỗi phổ biến chỉ đơn giản là nói 'Dim exampleClass Như exampleClass' thay vì' Dim exampleClass As New exampleClass'. –

16

Một cách dễ dàng để có được điều này:

Person myPet = GetPersonFromDatabase(); 
// check for myPet == null... AND for myPet.PetType == null 
if (myPet.PetType == "cat") <--- fall down go boom! 
+1

Câu trả lời của Jay thể hiện một ví dụ khác không được bao hàm bởi bất kỳ câu trả lời nào khác ở đây. – Iain

0

Nếu tôi có các lớp:

public class MyClass 
{ 
    public void MyMethod() 
    { 

    } 
} 

và sau đó tôi làm:

MyClass myClass = null; 
myClass.MyMethod(); 

Dòng thứ hai ném ngoại lệ này bởi vì Tôi đang gọi phương thức trên đối tượng reference typenull (Tức là chưa là instantiated bằng cách gọi myClass = new MyClass())

+0

Nếu tôi có một danh sách bên trong một lớp khác, như sau: https://pastebin.com/aWhfu8UM. Tôi nhận được một 'ngoại lệ thời gian chạy (dòng 9): Tham chiếu đối tượng không được đặt thành một thể hiện của một đối tượng.' lỗi – Si8

9

Tóm lại nó có nghĩa là .. Bạn đang cố gắng truy cập một đối tượng mà không cần instantiating nó .. Bạn có thể cần phải sử dụng từ khóa "mới" để khởi tạo nó đầu tiên, tức là tạo một thể hiện của nó.

Đối với ví dụ:

public class MyClass 
{ 
    public int Id {get; set;} 
} 

MyClass myClass; 

myClass.Id = 0; <----------- An error will be thrown here.. because myClass is null here... 

Bạn sẽ phải sử dụng:

myClass = new MyClass(); 
myClass.Id = 0; 

Hy vọng tôi đã làm cho nó rõ ràng ..

+0

Tôi nghĩ câu trả lời này là câu trả lời tốt nhất cho NullException. Nó đã lưu một dự án của tôi. –

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