Object reference not set to an instance of an object là lỗi gì? Một số lỗi liên quan

Máy chạy bộ Bình Thuận

Hướng dẫn tập luyện với máy chạy bộ tại Bình Thuận

Object reference not set to an instance of an object là lỗi gì
Dinh dưỡng khỏe

Object reference not set to an instance of an object là lỗi gì? Một số lỗi liên quan

Object reference not set to an instance of an object là lỗi đầu tiên mà bất cứ ai đều sẽ gặp khi là lập trình viên mới bắt đầu. Vậy Object reference not set to an instance of an object là lỗi gì? và cách sử nó nó như thế nào? Hãy cùng mình đi vào bài viết để hiểu rõ hơn về vấn đề này nhé!
Xem thêm những thông tin bổ ích tại đây nhé !

Object reference not set to an instance of an object là lỗi gì?

Object reference not set to an instance of an object là lỗi gì

Đầu tiên bạn cần biết rằng tất cả các biến và thẻ hoạt động trong .net đều là các đối tượng.

Các số nhận dạng chung, chẳng hạn như int, string, char, v.v., cuối cùng sẽ được chuyển đổi thành tên lớp và lưu trong hệ thống (như Int32, String, Char, v.v.), chưa kể đến việc khởi tạo lớp. Các đối tượng phải có một số thuộc tính và phương thức nhất định. Nếu bạn muốn làm việc một đối tượng nào đó, bạn cũng phải thao tác các thuộc tính hoặc phương thức của nó.

Lỗi về “Object reference not set to an instance of an object” là lỗi mà phiên bản đối tượng bạn muốn gọi không chứa thuộc tính hoặc phương thức bạn muốn hoạt động, nhưng thuộc tính hoặc phương thức bạn muốn hoạt động được lại được gán trong đối tượng của bạn và bị  báo lỗi, cũng có thể đối tượng bạn đang thao tác trở thành null. Bởi vì null thực sự là một đối tượng (kiểu Nullable), nó sẽ không nhắc bạn với thông tin như “The object you are operating is empty”, nhưng không có thuộc tính hoặc phương thức nào bạn muốn hoạt động trong cá thể đối tượng, nghĩa là “No Set the object reference to the instance of the object”.
Xem thêm những thông tin bổ ích tại đây

NullReferenceException là gì?

“Tham chiếu đối tượng không được đặt thành một phiên bản của đối tượng.” Tạo viên đá đầu tiên cho những ai không bao giờ gặp khó khăn với thông báo lỗi này khi họ là một lập trình viên C # /. NET mới bắt đầu.

Thông báo lỗi khét tiếng và đáng sợ này xảy ra khi bạn nhận được NullReferenceException. Ngoại lệ này được đưa ra khi bạn cố gắng truy cập vào một thành viên — ví dụ: một phương thức hoặc một thuộc tính — trên một biến hiện đang giữ một tham chiếu rỗng.

Nhưng tham chiếu null là gì? “Tham chiếu” ở vị trí đầu tiên là gì? Làm thế nào bạn có thể ngăn NullReferenceException xảy ra trong mã của bạn? Đó là những gì chúng ta sẽ đề cập trong bài viết hôm nay.

Chúng tôi sẽ bắt đầu với các nguyên tắc cơ bản, bằng cách giải thích ngắn gọn về những gì tham chiếu trong C # /. NET. Sau đó, bạn sẽ tìm hiểu tham chiếu rỗng là gì. Tại thời điểm này, bạn đã đi được nửa chặng đường để nhìn thấy toàn cảnh.

Sau vòng định nghĩa lý thuyết này, chúng ta sẽ đi đến những vấn đề thực tế hơn, hướng dẫn bạn cách tránh NullReferenceException trong thực tế. Nào cùng đào vào bên trong.

Tài liệu tham khảo là gì?

Chúng ta đã biết rằng NullReferenceException được gây ra bởi một tham chiếu rỗng. Nhưng tham chiếu null là gì? Nó khác với tham chiếu không null theo cách nào?

Trong .NET, bạn có thể chia các kiểu dữ liệu thành hai loại: kiểu giá trị và kiểu tham chiếu. Nếu bạn có một biến kiểu giá trị, nó sẽ lưu giá trị đó. Mặt khác, các biến kiểu tham chiếu không tự giữ giá trị. Họ giữ một tham chiếu trỏ đến nơi đối tượng sống trong bộ nhớ.

Nếu nó giúp bạn hình dung rõ hơn, bạn có thể coi tham chiếu như một liên kết trỏ đến một trang web hoặc một lối tắt trỏ đến một tệp trên máy tính của bạn. Các kiểu như int (và các kiểu nguyên thủy số khác), DateTime và boolean là các kiểu giá trị. Đó là, cấu trúc là kiểu giá trị. Các lớp là các kiểu tham chiếu.

Vì vậy, một tham chiếu là những gì một biến của kiểu tham chiếu chứa. Tuy nhiên, các biến này có thể trỏ đến “không có gì” và đó là những gì chúng tôi gọi là tham chiếu rỗng: tham chiếu không trỏ đến bất kỳ đối tượng nào. Khi bạn cố gắng gọi một phương thức hoặc một thành viên khác trên biến đã nói, bạn nhận được NullReferenceException.

Hiểu về NullReferenceException

Các lỗi tham chiếu rỗng là nguyên nhân cho một tỷ lệ lớn của tất cả các lỗi ứng dụng . Chúng thường là những vấn đề rất đơn giản do không thêm logic bổ sung để đảm bảo rằng các đối tượng có giá trị hợp lệ trước khi sử dụng chúng. Dưới đây là một số cách để tránh NullReferenceException.

Đoạn mã sau sẽ ném ra một NullReferenceException nếu biến “văn bản” được chuyển vào là null. Bạn không thể gọi ToUpper () trên một chuỗi rỗng.

public void MyMethod ( string text ) { // Ném ngoại lệ if text == null if ( text . ToUpper () == "Hello World" ) { // làm gì đó } }  

 

Bạn cũng có thể có các ngoại lệ tham chiếu null vì bất kỳ loại đối tượng nào cũng là null. Ví dụ, trong đoạn mã dưới đây, đối tượng SqlCommand không bao giờ được khởi tạo. Không chạy một truy vấn SQL sẽ là một vấn đề nghiêm trọng đối với ứng dụng của bạn. Một chuỗi null có thể là một cái gì đó bạn chỉ cần bỏ qua và tiếp tục. Những lần khác, như với SqlCommand, nó có thể là một vấn đề nghiêm trọng mà bạn không muốn bỏ qua.

Lệnh SqlCommand = null ; //Ngoại lệ! Tham chiếu đối tượng không được đặt thành một phiên bản của 
lệnh đối tượng . ExecuteNonQuery (); 

Sử dụng Toán tử có điều kiện Null để tránh NullReferenceExceptions

Một trong những bổ sung mới tốt nhất cho C # là toán tử điều kiện null . Thay vì có một số lượng lớn kiểm tra kiểu “biến! = Null”, bạn có thể sử dụng “?” và mã của bạn sẽ ngắn mạch và trả về null thay vì ném ngoại lệ. Điều này sẽ có ý nghĩa hơn với một số ví dụ dưới đây:

văn bản ?. ToUpper (); // từ ví dụ trước, sẽ trả về null 

int ? length = customerList ?. Chiều dài ; // null nếu customerList là null    Khách hàng đầu tiên = customerList ? [ 0 ]; // null nếu customerList là null   int ? count = customerList ? [ 0 ] ?. Đơn đặt hàng ?. Đếm (); // null nếu customerList, khách hàng đầu tiên hoặc Đơn đặt hàng là null   
  

Sử dụng Null Coalescing để tránh NullReferenceExceptions

Một tính năng tuyệt vời khác là liên kết rỗng , đó là “??” nhà điều hành. Nó hoạt động tốt để cung cấp giá trị mặc định cho một biến null. Nó hoạt động với tất cả các kiểu dữ liệu nullable.

Đoạn mã sau ném một ngoại lệ mà không liên kết null. Thêm “?? new List <string> () ”ngăn ngoại lệ“ Đối tượng tham chiếu không được đặt thành thể hiện của đối tượng ”.

Liệt kê các giá trị <string> = null ; 

foreach ( giá trị var trong các giá trị ?? new List <string> ()) { Bảng điều khiển . WriteLine ( giá trị ); }     

Ví dụ đơn giản về giá trị rỗng gây ra vấn đề

Một số nguyên nhân phổ biến nhất là cài đặt, lệnh gọi cơ sở dữ liệu hoặc lệnh gọi loại API không trả về giá trị mong đợi. Ví dụ: bạn thêm một trường mới vào cơ sở dữ liệu của mình và không điền các giá trị mặc định cho mọi bản ghi. Các bản ghi ngẫu nhiên được truy vấn và mã không giải thích cho trường mới đó là trống. KA-BOOM: Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng.

Quy tắc vàng của lập trình

Trong nhiều năm, tôi đã có một câu nói mà tôi luôn nói với đội của mình. Tôi gọi đó là quy tắc vàng của lập trình. Tôi nghĩ rằng mọi lập trình viên mới cần có một hình xăm nói lên điều đó.

“Nếu nó có thể là null, nó sẽ là null”

Tin tốt là có thể tránh được rất nhiều lỗi tham chiếu rỗng bằng cách thêm logic và mã bổ sung để đảm bảo các đối tượng không bị rỗng trước khi cố gắng sử dụng chúng. Các nhà phát triển nên luôn cho rằng mọi thứ đều không hợp lệ và rất phòng thủ trong mã của họ.  Giả sử mọi lệnh gọi cơ sở dữ liệu sẽ không thành công, mọi trường sẽ có dữ liệu lộn xộn trong đó. Các phương pháp hay nhất về xử lý ngoại lệ tốt là rất quan trọng.

Mẹo để Ngăn chặn Ngoại lệ Tham chiếu Null

  1. Khởi tạo các biến có giá trị hợp lệ.
  2. Nếu một biến có thể là null, thì hãy kiểm tra null và xử lý nó một cách thích hợp
  3. Sử dụng ? toán tử trên các phương thức khi có thể. stringvar? .ToUpper ();
  4. Sử dụng các công cụ như Resharper để giúp chỉ ra các ngoại lệ tham chiếu rỗng tiềm ẩn

Tránh NullReferenceException với các kiểu Nullable của C # 8.0

Một trong những nguyên nhân chính của lỗi với tham chiếu null là thực tế là trong C mọi đối tượng kiểu tham chiếu đều có thể là null, mọi lúc. Điều gì sẽ xảy ra nếu bạn, nhà phát triển, có quyền nói: “Tôi muốn chuỗi này không bao giờ là null”? Tốt hơn, điều gì sẽ xảy ra nếu quyết định này được thực thi bởi chính trình biên dịch, ngăn bạn và các nhà phát triển khác vô tình gán null cho biến đã nói? Nghe hay đấy? Tin tốt là: đây là một tính năng thực sự của phiên bản thứ tám của C # được gọi là kiểu nullable.

Tính năng này hoạt động một cách khéo léo và mạnh mẽ. Nó xác định lại các loại tham chiếu là không thể null theo mặc định – như nhiều người cho rằng chúng đáng ra phải có ngay từ đầu. Sau đó, nó thêm một loại cú pháp mới cho phép bạn xác định các biến nullable (mặc dù vậy, nó không thực sự mới, vì nó cùng một cú pháp đã được sử dụng trong vài năm cho các loại giá trị nullable.)

Để hiểu rõ hơn, hãy xem ví dụ sau:

static int Thêm ( chuỗi số ) { trả về số . Tách ( "," ). Chọn ( int . Phân tích cú pháp ). Tính tổng (); }  

    

Trong phiên bản C # trước 8.0, đoạn mã trên rất nguy hiểm. Các số biến có thể là null, mà có thể gây ra một NullReferenceException khi cố gắng sử dụng chia phương pháp.

Với tính năng loại tham chiếu có thể trống trong C # 8.0, bạn sẽ an toàn. Biến không bao giờ được rỗng và lệnh gọi đến phương thức Split sẽ không bao giờ ném. Bất kỳ nỗ lực nào chuyển null cho phương thức Add sẽ dẫn đến lỗi biên dịch.

Nhưng nếu bạn muốn cho phép số null thì sao? Trong trường hợp đó, bạn chỉ cần thêm dấu chấm hỏi sau tên của loại:

static int Thêm ( chuỗi ? số ) { trả về số . Tách ( "," ). Chọn ( int . Phân tích cú pháp ). Tính tổng (); }  

	

Bây giờ mọi thứ thay đổi đáng kể. Vì các số bây giờ có thể là null, trình biên dịch sẽ thúc đẩy bạn kiểm tra giá trị của biến, kèm theo cảnh báo (bạn có thể biến cảnh báo thành lỗi trình biên dịch, để an toàn hơn):

Trình biên dịch cho tôi biết rằng “số” có thể là null. Các giải pháp khả thi bao gồm:

  • Sử dụng câu lệnh if để đảm bảo biến có tham chiếu hợp lệ
  • Sử dụng toán tử kết hợp null đã được đề cập khi gọi phương thức Split
  • Đặt lại biến “số” thành không thể null bằng cách xóa dấu chấm hỏi
  • Ngăn chặn quy tắc đưa ra cảnh báo cho chúng tôi (điều này sẽ đánh bại toàn bộ mục đích nhưng này, đó là một lựa chọn.)

Hãy nhớ rằng tính năng này được chọn tham gia. Có nghĩa là, nó bị vô hiệu hóa theo mặc định và bạn phải kích hoạt nó trong cấu hình dự án của mình. Lý do cho điều đó là việc vận chuyển tính năng đã được bật sẽ gây ra những thay đổi vi phạm trong hầu hết các cơ sở mã.

Các bước tiếp theo là gì?

Các ngoại lệ tham chiếu rỗng là một vấn đề rất phổ biến trong .NET và hầu hết các ngôn ngữ lập trình. May mắn thay, tất cả chúng ta đều có thể đổ lỗi cho Tony Hoare . Ông đã phát minh ra các tham chiếu rỗng và thậm chí gọi đó là sai lầm hàng tỷ đô la.

Đùa nhau, làm sao tránh được chuyện như vậy? Một cách khác là tuân theo quy tắc vàng của tôi: tôi có thể là null, nó sẽ là null!

Ngày nay, may mắn thay, chúng ta có thể có sự trợ giúp của chính trình biên dịch khi chống lại NullReferenceException. Bật tính năng “loại tham chiếu có thể null” trong C # 8.0 và bằng cách đó, bạn sẽ có thể ngăn mọi thứ không có giá trị nếu muốn. Điều đó cho phép chúng tôi xoay quanh quy tắc cũ của tôi: Nếu nó không thể là null, nó sẽ không bao giờ là null. Trình biên dịch sẽ không cho phép nó!

Bạn có muốn biết thêm về C #, các ngoại lệ và các chủ đề liên quan khác không? Nếu vậy, hãy theo dõi blog Stackify, vì chúng tôi luôn xuất bản các bài đăng về những chủ đề này và hơn thế nữa.

Ngoài ra, hãy đảm bảo rằng bạn tận dụng sức mạnh của các công cụ theo ý mình. Ví dụ: Stackify cung cấp một công cụ gọi là Tiền tố, cho phép bạn giám sát ứng dụng web của mình được viết bằng .NET hoặc Java. Bạn sẽ có thể theo dõi hiệu suất của ứng dụng và cũng có thể tìm thấy các ngoại lệ ẩn, truy vấn chậm và các vấn đề khác.

Một số lỗi liên quan tới Object reference not set to an instance of an object

  • DataSet trống.
  • Đối tượng Session trống.
  • DataReader trống do câu lệnh SQL hoặc DataBase.
  • Đối tượng ViewState là Null.
  • Sử dụng biến mà không gán giá trị null khi khai báo một biến chuỗi.
  • Khi gán giá trị văn bản cho đối tượng giá trị đó không tồn tại.
  • Khi sử dụng lệnh  Request.QueryString (), đối tượng thu về  được không tồn tại, hoặc giá trị ban đầu không được gán khi giá trị trống.
  • Khi sử dụng FindControl, điều khiển không tồn tại nhưng không có xử lý trước nào được thực hiện.
  • Không gian tên của đối tượng không được tham chiếu.
  • Tên điều khiển không tương ứng trong phần mã.
  • Nếu biến cài đặt trống hoặc không nhận giá trị, thì sẽ xảy ra lỗi khi truyền tham số. Nó cũng xuất hiện khi sử dụng các điều khiển dữ liệu như DataGridView hoặc DataList.
  • Đối tượng không được khởi tạo bằng new.
  • Một trường hợp nào đó xảy ra trong chương trình, làm cho việc khởi tạo không thành công và đối tượng là Null.
  • Định nghĩa trùng lặp gây ra lỗi thể hiện là không thiết lập tham chiếu đối tượng cho đối tượng.
    Xem thêm những thông tin bổ ích tại đây nhé !

Giải pháp khi gặp lỗi Object reference not set to an instance of an object

Object reference not set to an instance of an object là lỗi gì

Chúng ta có thể dùng 2 cách sau đây để giải quyết tình trạng khi gặp lỗi về Object reference not set to an instance of an object:

Cách 1: Sử dụng Try..Catch … Finally để bắt lỗi hoặc trực tiếp sử dụng response.write () để xuất gợi ý giá trị của biến.

Cách 2: Kiểm tra lại các biến và xem có biến chưa khởi tạo trong mã không.
Xem thêm những thông tinbổ ích tại đây nhé !

Trên đây là một số cách nhận biết Object reference not set to an instance of an object là lỗi gì và cách xử lý nó như thế nào, cũng như các lỗi liên quan đến nó, mong rằng những bạn đã từng gặp hoặc chưa gặp lỗi này có thể áp dụng để kahwcs phục và sửa chữa.

Nguồn: https://infobookmarks.info/

Bình luận

LEAVE A RESPONSE

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *