【C#】オブジェクト参照がオブジェクト インスタンスに設定されていません。の解決方法【System.NullReferenceException:】

C#,エラー/例外

C#で発生するエラー(例外)
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

上記のエラー(例外)が発生したときの解決方法をご紹介します。



下記にC#で発生する例外処理の一覧をまとめていますので解決できない場合は合わせてご確認ください。
⇒例外処理クラス一覧まとめ【原因と解決方法】

C#のおすすめ講座を受講して、最短1週間でC#をマスターしよう!
⇒C#が学べるおすすめプログラミングスクール&オンライン講座11選


C# オブジェクト参照がオブジェクト インスタンスに設定されていません。のエラーの原因

System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
のエラーの原因は
nullが格納された変数のメソッドを呼び出した
からです。
Nullとは、プログラミング言語のデータ表現の一種で、何のデータも含まれない状態のことです。Nullについての詳細はこちら


エラーコードの例は下記のとおりです。

int[] a = null;
// 変数aにnullが格納されているのに「a.Length」を呼び出す→エラー(例外)
for (int i = 0;i < a.Length; i++)
{
    a[i] = 0;
}
String text = null;
// 変数textにnullが格納されているのに「text.Substring(2)」を呼び出す→エラー(例外)
String textError = text.Substring(2);

上記のエラーコードのように、値が「null」の変数のメソッド(関数)を呼び出すとエラーが発生します。

NullReferenceExceptionエラーのイメージ

null.メソッド()
というように、存在が無いもの(null)に処理をお願いすると、エラーになります。

メソッドを使用するときはオブジェクトをインスタンス化する必要があります。
System.NullReferenceException」の詳細はこちらから


C# オブジェクト参照がオブジェクト インスタンスに設定されていません。エラーの解決方法

System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。のエラーを解決する方法をご紹介します。

①nullオブジェクトにデータ型の値を設定する

// 変数aのインスタンスを生成する
int[] a = new int[3];
for (int i = 0;i < a.Length; i++)
{
    a[i] = 0;
}
// 変数textにインスタンスを生成する
String text = "エラーの解消法です";
String textError = text.Substring(2);

上記のように、nullを代入していた箇所にインスタンスを生成する処理を書き換えればエラー(例外)が解消されます。
これは、String型やint[]型以外のList型や他クラスでも同じです。

// List型変数のエラー解消法(参考)
List<String> textList = new List<String>();
int textListCount = textList.Count;



②メソッド実行前にnullチェックを行う

String text = "エラーの解消法です";
// メソッド実行前にnullチェックを行う
if (null != text)
{
    String textError = text.Substring(2);
}

// メソッド実行前にnullチェックを行う
if (!System.String.IsNullOrEmpty(text))
{
    String textError = text.Substring(2);
}

メソッド前にnull判定を行うことで、エラーを回避します。
2段落目の「System.String.IsNullOrEmpty(text)」のようにデータ型ごとにnull判定を行う標準クラスライブラリもあります。
※標準クラスライブラリは、「よく使う処理を機能ごとにまとめてそれを他のプログラムから呼び出せるようにしたもの」です。詳しくはこちら

③try-catch内に処理を記載し、例外をキャッチする

try
{
    // 変数textにインスタンスを生成する
    String text = null;
    String textError = text.Substring(2);
}
catch (Exception e)
{
    //エラーが発生した時の処理
}

上記3つが主な「System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。」の解決策です。


より良いコードを書くために

おすすめの対処法を3つ紹介しましたが、
②メソッド実行前にnullチェックを行う
が、開発現場で一番よく使用されているNullReferenceException」のエラー対策です。
nullによるエラーが発生し得る箇所の前には必ず、nullチェックを行いましょう。




①の対応策だと、別の処理で変数がnullに更新されると、よくエラーが発生します。注意してください。
大規模なシステム開発などでバグが発生しやすい「変更に弱いコードです。


③の対応策

③の対応策。運用保守の時に助かります。

③の対応策はnullによる例外が発生したときに、エラーの詳細を「Exception e」に格納できます
それにより、エラーの内容をプログラマーが確認できるため、システム開発時のバグの特定が容易になります。大規模なシステム開発の際は、システム開発の運用保守を考え、③の対応策を選択することをおすすめします。





エラーを解決できなくて途方に暮れている人へ。

■無料プログラミング講座を開設しています!
下記にVisual Studioを使ったC#プログラミング初心者向け完全ガイドを掲載しています。

このガイドを一通り勉強すれば、C#プログラミングの基礎が学べます。
是非チャレンジしてみてください!

C#初心者向けに始め方ガイドを作成しています。
筆者

プログラミング初心者の方はぜひチャレンジしてみてください!!

C#,エラー/例外

Posted by 9noike