MSDN ライブラリ
この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

NullReferenceException クラス

 

null オブジェクト参照を逆参照しようとした場合にスローされる例外。

名前空間:   System
アセンブリ:  mscorlib (mscorlib.dll 内)

System.Object
  System.Exception
    System.SystemException
      System.NullReferenceException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class NullReferenceException : SystemException

名前説明
System_CAPS_pubmethodNullReferenceException()

新しいインスタンスを初期化、 NullReferenceException クラスの設定、 Message "、値 'null' が見つかりましたオブジェクトのインスタンスが必要である"などのエラーを説明するシステム提供のメッセージの新しいインスタンスのプロパティ。 このメッセージには、現在のシステムのカルチャが考慮されます。

System_CAPS_protmethodNullReferenceException(SerializationInfo, StreamingContext)

シリアル化したデータを使用して、NullReferenceException クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodNullReferenceException(String)

指定したエラー メッセージを使用して、NullReferenceException クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodNullReferenceException(String, Exception)

指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、NullReferenceException クラスの新しいインスタンスを初期化します。

名前説明
System_CAPS_pubpropertyData

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。(Exception から継承されました。)

System_CAPS_pubpropertyHelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。(Exception から継承されました。)

System_CAPS_pubpropertyHResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。(Exception から継承されました。)

System_CAPS_pubpropertyInnerException

現在の例外の原因となる Exception インスタンスを取得します。(Exception から継承されました。)

System_CAPS_pubpropertyMessage

現在の例外を説明するメッセージを取得します。(Exception から継承されました。)

System_CAPS_pubpropertySource

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。(Exception から継承されました。)

System_CAPS_pubpropertyStackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。(Exception から継承されました。)

System_CAPS_pubpropertyTargetSite

現在の例外がスローされたメソッドを取得します。(Exception から継承されました。)

名前説明
System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されました。)

System_CAPS_protmethodFinalize()

オブジェクトがガベジ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されました。)

System_CAPS_pubmethodGetBaseException()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。(Exception から継承されました。)

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されました。)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。(Exception から継承されました。)

System_CAPS_pubmethodGetType()

現在のインスタンスのランタイム型を取得します。(Exception から継承されました。)

System_CAPS_protmethodMemberwiseClone()

現在の Object の簡易コピーを作成します。(Object から継承されました。)

System_CAPS_pubmethodToString()

現在の例外の文字列形式を作成して返します。(Exception から継承されました。)

名前説明
System_CAPS_proteventSerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。(Exception から継承されました。)

A NullReferenceException を値型のメンバーにアクセスしようとすると、例外がスローされます nullします。 A NullReferenceException 例外は、通常開発者のエラーを反映し、次のシナリオでスローされます。

  • 参照型をインスタンス化を忘れてしまった。 次の例で names が宣言されても、インスタンス化します。

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main(string[] args)
       {
          int value = Int32.Parse(args[0]);
          List<String> names;
          if (value > 0)
             names = new List<String>();
    
          names.Add("Major Major Major");       
       }
    }
    // Compilation displays a warning like the following:
    //    Example1.vb(10) : warning BC42104: Variable //names// is used before it 
    //    has been assigned a value. A null reference exception could result 
    //    at runtime.
    //    
    //          names.Add("Major Major Major")
    //          ~~~~~
    // The example displays output like the following output:
    //    Unhandled Exception: System.NullReferenceException: Object reference 
    //    not set to an instance of an object.
    //       at Example.Main()
    

    このコードをコンパイルするときに、一部のコンパイラは警告を発行します。 エラーを発行他のユーザーと、コンパイルは失敗します。 この問題を解決するには、オブジェクトをできるように、その値が不要になったインスタンス nullします。 次の例ではこの型のクラスのコンス トラクターを呼び出すことによってです。

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = new List<String>();
          names.Add("Major Major Major");
       }
    }
    
  • 取得する、 null 、メソッドから値を返し、返される型のメソッドを呼び出します。 ドキュメントのエラーの結果が場合があります。メソッドの呼び出しが返されることに、ドキュメントが失敗した nullします。 それ以外の場合に、コード誤って前提としています、このメソッドは常に返す以外null 値。

    次の例のコードがあると見なさ、 Array.Find<T> メソッドは常に返します Person オブジェクト FirstName フィールドが検索文字列と一致します。 一致がないために、ランタイム、 NullReferenceException 例外です。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra", 
                                              "Abraham", "Adrian", "Ariella", 
                                              "Arnold", "Aston", "Astor" } );    
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          Console.WriteLine(found.FirstName);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames) 
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       } 
    
       public String FirstName;
    }
    // The example displays the following output:
    //       Unhandled Exception: System.NullReferenceException: 
    //       Object reference not set to an instance of an object.
    //          at Example.Main()
    

    この問題を解決するではないことを確認するメソッドの戻り値をテスト null を次の例では、そのメンバーを呼び出します。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra", 
                                              "Abraham", "Adrian", "Ariella", 
                                              "Arnold", "Aston", "Astor" } );    
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          if (found != null)
             Console.WriteLine(found.FirstName);
          else
             Console.WriteLine("{0} not found.", nameToFind);   
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames) 
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       } 
    
       public String FirstName;
    }
    // The example displays the following output:
    //        Robert not found
    
  • 式を使用している (たとえばをチェーンしてメソッドまたはプロパティの一覧化) 値を取得して、値がどうかをチェックする場合が null, 、ランタイムはまだ、スロー、 NullReferenceException 例外です。 これが発生するため、式の中間値のいずれかの nullです。 その結果、残りの部分の null は評価されません。

    次の例、 Pages によって提示される web ページに関する情報をキャッシュするオブジェクト Page オブジェクトです。 Example.Main メソッドとをチェックするかどうか、現在の web ページ、null 以外のタイトルを持つ場合は、タイトルが表示されます。 このチェックに関係なく、メソッドをスローする NullReferenceException 例外です。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          if (! String.IsNullOrEmpty(pages.CurrentPage.Title)) {
             String title = pages.CurrentPage.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
       }
    }
    
    public class Pages 
    {
       Page[] page = new Page[10];
       int ctr = 0;
    
       public Page CurrentPage
       {
          get { return page[ctr]; }
          set {
             // Move all the page objects down to accommodate the new one.
             if (ctr > page.GetUpperBound(0)) {
                for (int ndx = 1; ndx <= page.GetUpperBound(0); ndx++)
                   page[ndx - 1] = page[ndx];
             }    
             page[ctr] = value;
             if (ctr < page.GetUpperBound(0))
                ctr++; 
          }
       }
    
       public Page PreviousPage
       {
          get {
             if (ctr == 0) { 
                if (page[0] == null)
                   return null;
                else
                   return page[0];
             }
             else {
                ctr--;
                return page[ctr + 1];
             }
          }
       }         
    }
    
    public class Page
    {
       public Uri URL;
       public String Title;
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    に、例外がスローされます pages.CurrentPage 返します null ページの情報がキャッシュに格納されていない場合。 この例外は、の値をテストして修正できる、 CurrentPage 現在を取得する前にプロパティ Page オブジェクトの Title プロパティには、次の例としては。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          Page current = pages.CurrentPage;
          if (current != null) {  
             String title = current.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
          else {
             Console.WriteLine("There is no page information in the cache.");
          }   
       }
    }
    // The example displays the following output:
    //       There is no page information in the cache.
    
  • 参照型、およびプロセスの要素の 1 つをスローしようとして格納する配列の要素を列挙している、 NullReferenceException 例外です。

    次の例では、文字列配列を定義します。 A for ステートメントは、配列内の要素を列挙し、各文字列を呼び出して Trim 文字列を表示する前にメソッドです。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", values[ctr].Trim(), 
                           ctr == values.GetUpperBound(0) ? "" : ", "); 
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    配列の各要素は、null 以外の値を含める必要がありますで配列要素の値が実際と仮定した場合、この例外が発生した nullします。 この例外は、要素があるかどうかをテストで解消できます null その要素に対する任意の操作を実行する前に次の例として示しています。

    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", 
                           values[ctr] != null ? values[ctr].Trim() : "", 
                           ctr == values.GetUpperBound(0) ? "" : ", "); 
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //       one, , two
    
  • A NullReferenceException に渡されるメソッドによって例外がスローされた nullします。 いくつかのメソッドに渡される引数を検証します。 行われていて、引数の 1 つは、 null, 、メソッドをスロー、 System.ArgumentNullException 例外です。 それ以外の場合、スロー、 NullReferenceException 例外です。 次の例では、このシナリオを示します。

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = GetData();
          PopulateNames(names);
       }
    
       private static void PopulateNames(List<String> names)
       {
          String[] arrNames = { "Dakota", "Samuel", "Nikita",
                                "Koani", "Saya", "Yiska", "Yumaevsky" };
          foreach (var arrName in arrNames)
             names.Add(arrName);
       }
    
       private static List<String> GetData() 
       {
          return null;   
    
       }
    }
    // The example displays output like the following:
    //    Unhandled Exception: System.NullReferenceException: Object reference 
    //    not set to an instance of an object.
    //       at Example.PopulateNames(List`1 names)
    //       at Example.Main()
    

    この問題を解決するメソッドに渡される引数がないがあることを確認します null, でスローされた例外を処理または、 try…catch…finally ブロックします。 詳細については、「例外の処理とスロー」を参照してください。

次の Microsoft intermediate language (MSIL) の命令をスロー NullReferenceException: callvirt, 、cpblk, 、cpobj, 、initblk, 、ldelem.<type>, 、ldelema, 、ldfld, 、ldflda, 、ldind.<type>, 、ldlen, 、stelem.<type>, 、stfld, 、stind.<type>, 、throw, 、および unboxです。

NullReferenceException 値は 0x80004003 HRESULT COR_E_NULLREFERENCE を使用します。

インスタンスの初期プロパティ値の一覧については NullReferenceException, を参照してください、 NullReferenceException コンス トラクターです。

リリース コードにおける NullReferenceException の処理

通常、その後に処理が発生した nullreferenceexception が発生しないようにお勧めします。 例外の処理によって、コードは管理や理解が難しくなることがあるうえ、他のバグが生じることも考えられます。 NullReferenceException は多くの場合、回復不能なエラーです。 こうした場合、例外によってアプリを停止させることが最良の代替策である可能性があります。

ただし、次のように、エラーの処理が有用である状況は多く存在します。

  • アプリは null であるオブジェクトを無視できます。 たとえば、アプリがデータベース内のレコードを取得して処理する場合、結果として null オブジェクトである、いくつかの不良レコードを無視できる可能性があります。 必要な処理は、ログ ファイルまたはアプリケーションの UI に不良データを記録することだけであることが考えられます。

  • 例外から回復することができます。 たとえば、参照型を返す Web サービスの呼び出しは、接続が失われた場合や接続がタイムアウトした場合には、null を返す可能性があります。 接続を再確立し、呼び出しを再度試すことができます。

  • アプリの状態を有効な状態に復元できます。 たとえば、NullReferenceException をスローするメソッドを呼び出す前に、情報をデータ ストアに保存する必要がある、複数手順のタスクを実行していることがあります。 初期化されていないオブジェクトがデータ レコードを破損する可能性がある場合、アプリを終了する前に過去のデータを削除できます。

  • 例外の報告が推奨されます。 たとえば、エラーがアプリのユーザーによる間違いに起因する場合、メッセージを生成して、ユーザーが正しい情報を入力するのを支援できます。 問題の解決に役立てるために、エラーに関する情報をログに記録することもできます。 ASP.NET などのいくつかのフレームワークには、アプリのクラッシュを防止するために、すべてのエラーをキャプチャする上位レベルの例外ハンドラーが用意されています。このハンドラーを使用した場合、例外をログに記録することが、その例外が発生したことを知る唯一の方法になる可能性があります。

Universal Windows Platform
8 から利用可能
.NET Framework
1.1 から利用可能
Portable Class Library
サポート対象 : portable .NET platforms
Silverlight
2.0 から利用可能
Windows Phone Silverlight
7.0 から利用可能
Windows Phone
8.1 から利用可能

すべてのパブリック構造体 (Shared Visual Basic では) メンバーは、スレッド セーフです。 Aインスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示:
© 2016 Microsoft