[DOTNETVN] Xử lý object reference not set to an instance of an object

Trong bài viết này mình sẽ trình bày một cách đơn giản nhất về lỗi "object reference not set to an instance of an object" và hướng để giải quyết nhanh lỗi này.

"object reference not set to an instance of an object" là một exception rất phổ biến trong lập trình. Theo mình thì đa số các lập trình viên từ junior cho tới dev cứng đi chăn nữa thì vẫn gặp phải lỗi này bình thường. Thật ra thì lỗi này chả có gì ghê gớm cả. Các bạn hiểu nôm na thế này là có một đối tượng hoặc một object  nào đó bạn đang sử dụng nhưng nó chưa được khởi tạo thì lúc này giá trị của nó sẽ là NULL vào khi bạn gọi một object với khi nó đang mang giá trị NULL thì lập tức một exception huyền thoại sẽ văng ra ngay lập tức "object reference not set to an instance of an object".

Giờ chúng ta cùng phân tích ví dụ bên dưới của mình nha, mình có 1 hàm như bên dưới:

public void Push(IMessage message)
{
    var type = message.GetType();

    if (type == typeof(EmailMessage))
    {
        var service = _services.First(c => c.GetType() == typeof(EmailMessageService));
        service.Delivery(message);
    }
}

Hàm trên có nhiệm vụ là push 1 message vào queue và deliver nó vào hệ thống để thực hiện 1 nhiệm vụ nào đó. Vậy hàm này có khả năng phát sinh lỗi "object reference not set to an instance of an object"?. Câu trả lời là có thể, vậy chỗ nào có khả năng gây ra lỗi?

  1. Thứ nhất là cái Interface IMessage mà mình truyền nào bị null. Khi nó bị null thì ngay ở câu lệnh GetType() chắc chắn sẽ có 1 lỗi "object reference not set to an instance of an object" được ném ra.
  2. Mình dùng LINQ để gọi First() cũng có khả năng gây ra lỗi "object reference not set to an instance of an object" vì cái list _services có mình có khả năng chưa được khởi tạo.
  3. Giả sử như cái service của mình sau khi lấy ra thành công nhưng trong cái list _services đó lại không chứa giá trị mà mình đang tìm kiếm thông qua hàm First() thì lúc này nó sẽ mang giá trị là null. Vậy thì lệnh service.Deliver(message) của mình cũng sẽ ném ra lỗi "object reference not set to an instance of an object".

Như các bạn cũng thấy rằng chỉ 1 hàm nhìn vào tưởng chừng như đơn giản nhưng khi phân tích lại thì khả năng gây ra lỗi lại khá nhiều đúng không?. Vậy giải pháp nên làm là gì?. 

Các bạn không nên kiểm tra exception hay bắt try cach tại đây vì đây là hàm business logic nếu nó có lỗi các bạn nên để nó ném lỗi ra ngoài luôn và để tầng UI hay Presentation handle lỗi. Vì rõ ràng hàm này thực chất không có lỗi, lỗi là từ đối tượng sử dụng nó lên ngoài đã truyền vào 1 object bị null. Lúc này bạn nên quay lại truy xem đối tượng gọi nó và cách mà paramter được truyền vào.

Tóm lại cách giải quyết khi hệ thống ném ra lỗi "object reference not set to an instance of an object" như sau:

  1. Kiểm tra lại parameter khác null trước khi truyền vào hàm xử lý business của các bạn.
  2. Kiểm tra lại các đối tượng bạn đã sử dụng đã được khởi tạo hay chưa.
  3. Truy tìm lại đối tượng cha để tìm hiểu xem chỗ nào đang null or chưa được khởi tạo.
  4. Handle lỗi ở tầng UI or Presentation (bắt lỗi và thông báo ra màn hình or ghi nhận log lại...).

 

Thông tin bài viết