.NET[C#]のNull ReferenceException(オブジェクトをインスタンスに参照しない)はどのような問題ですか?修復処理の方法


もんだいぶんせき


C#の開発で、「N ullReferenceException」または「オブジェクトをインスタンスに参照していない」というプロンプトに遭遇した場合、プログラムコードがnullの参照タイプのエンティティにアクセスしようとして投げ出された例外です.可能な理由は次のとおりです.

シナリオ1参照タイプエンティティがインスタンス化されていません


リファレンスタイプをインスタンス化するのを忘れました.次の例では、namesは宣言しますが、インスタンス化されません.
using System;
using System.Collections.Generic;

public class Example
{
   public static void Main(string[] args)
   {
      int value = Int32.Parse(args[0]);
      List names;
      names.Add("Major Major Major");       
   }
}

この例のnamesは使用前に初期化されず、修復後:
using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      List names = new List();
      names.Add("Major Major Major");
   }
}

情景二汎型連写


次のコードがあります.
ref1.ref2.ref3.member    

このコードは、ref 1またはref 2またはref 3のいずれかが空の場合、Null ReferenceException(オブジェクトをインスタンスに参照しない)の例外エラーを放出します.この式を書き換えて、以下のr 1,r 2,r 3がnullであるかどうかを確認することができます.
var r1 = ref1;    
var r2 = r1.ref2;
var r3 = r2.ref3;
r3.member

シナリオ3クラスのインスタンスは初期化されていません


次のコードがあります.
public class Book {
    public string Title { get; set; }
}
public class Example {
    public void Foo() {
        Book b1;
        string title = b1.Title; 
    }
}

ここで、Exampleクラスのb 1はインスタンス化されておらず、Null ReferenceException(オブジェクトをインスタンスに参照していない)異常が放出され、解決策は次のとおりです.
newキーワードを使用してb 1オブジェクトをインスタンス化する
修正後のコード:
public class Book {
    public string Title { get; set; }
}
public class Example {
    public void Foo() {
        Book b1 = new Book();
        string title = b1.Title;
    }
}

シナリオ四間接参照


次のコードがあります.
public class Person {
    public int Age { get; set; }
}
public class Book {
    public Person Author { get; set; }
}
public class Example {
    public void Foo() {
        Book b1 = new Book();
        int authorAge = b1.Author.Age; 
    }
}

ここでExampleクラスのb 1はインスタンス化されていますが、プログラムを実行すると、オブジェクトをインスタンスに参照しないNull ReferenceException例外が放出されます.Bookクラスには別の参照クラスPersonが含まれているがインスタンス化されていないため、解決策はBookのコンストラクタで直接インスタンス化することができる.
public class Person {
    public int Age { get; set; }
}
public class Book {
    public Book(){
        Author = new Person();
    }
    public Person Author { get; set; }
}
public class Example {
    public void Foo() {
        Book b1 = new Book();
        int authorAge = b1.Author.Age; 
    }
}

もちろん、Bookというクラスのインスタンスを使用するときにPersonという参照クラスを初期化することもできます.以下のようにします.
public class Person {
    public int Age { get; set; }
}
public class Book {
    public Person Author { get; set; }
}
public class Example {
    public void Foo() {
        Book b1 = new Book();
        b1.Author = new Person();
        int authorAge = b1.Author.Age; 
    }
}

シナリオ5配列null

int[] numbers = null;
int n = numbers[0]; 
Person[] people = new Person[5];
people[0].Age = 20
long[][] array = new long[1][];
array[0][0] = 3;

これら3つの配列の定義はnullであり、NullReferenceException(オブジェクトをインスタンスに参照しない)の例外を放出します.

シナリオ6データ辞書null

Dictionary agesForNames = null;
int age = agesForNames["Bob"];

ここでagesForNames辞書はnullで、NullReferenceException(オブジェクトをインスタンスに参照しない)の例外を放出し、newキーワードを使用して初期化します.
Dictionary agesForNames = new Dictionary();
int age = agesForNames["Bob"];

シナリオ7集合null

public class Person {
    public string Name { get; set; }
}
var people = new List();
people.Add(null);
var names = from p in people select p.Name;
string firstName = names.First(); 

以上のコードはnamesにあります.First()処理は異常を放出します.私たちは
people.Add(null);
null値が追加されました

シナリオ8イベント(Event)はnull

public class Demo
{
    public event EventHandler StateChanged;

    protected virtual void OnStateChanged(EventArgs e)
    {        
        StateChanged(this, e);
    }
}

外部インスタンスがStateChangedイベントを登録していない場合、StateChanged(this,e)が呼び出されます.オブジェクトをインスタンスに参照しないNull ReferenceExceptionが放出されます.修正方法:
public class Demo
{
    public event EventHandler StateChanged;

    protected virtual void OnStateChanged(EventArgs e)
    {      
        if(StateChanged != null)
        {  
            StateChanged(this, e);
        }
    }
}

シナリオ9の繰り返し変数名


グローバル変数とローカル変数の名前が同じである場合、グローバル変数は次のように指定されない可能性があります.
public class Form1 {
    private Customer customer;

    private void Form1_Load(object sender, EventArgs e) {
        Customer customer = new Customer();
        customer.Name = "John";
    }

    private void Button_Click(object sender, EventArgs e) {
        MessageBox.Show(customer.Name);
    }
}

異なる変数名を使用して修正してください:
private Customer _customer;    

シナリオ2 ASP.NETライフサイクル

public partial class Issues_Edit : System.Web.UI.Page
{
    protected TestIssue myIssue;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //            ,          
            myIssue = new TestIssue(); 
        }
    }

    protected void SaveButton_Click(object sender, EventArgs e)
    {
        myIssue.Entry = "NullReferenceException here!";
    }
}

シナリオ11 ASP.NETセッションの値はnull

string firstName = Session["FirstName"].ToString();

Session[FirstName]に値が割り当てられていない場合、Null ReferenceException(オブジェクトをインスタンスに参照しない)の例外が放出されます.

シナリオ12 ASP.NETビューモードnull

// Controller[   ]
public class Restaurant:Controller
{
    public ActionResult Search()
    {
         return View();  // Forgot the provide a Model here.
    }
}

// Razor[    ]
@foreach (var restaurantSearch in Model.RestaurantSearch)  //    
{
}

@Model.somePropertyName


についてNET[C#]のNull ReferenceException(オブジェクトをインスタンスに参照していない)をここにまとめ、異なるシナリオで同じ異常に遭遇した場合は、フィードバック、コミュニケーションを歓迎します.