【C#】NullReferenceExceptionを発生させてVisual Studioで解決する方法

Unityでの開発において、NullReferenceExceptionは頻繁に遭遇するエラーですが、その背後にはオブジェクト指向の基本的な概念が関わっています。オブジェクト指向の基礎を理解していないと、エラーの原因や対処法が分からず、ただ手順を追うだけの作業になりがちです。

このチュートリアルでは、コンソールアプリケーションを使って、オブジェクト指向の基本とNullReferenceExceptionの原因と対処法を理解することを目指します。


目次

  1. オブジェクト指向プログラミングの基本概念
  2. 開発環境の準備
  3. クラスとオブジェクトの作成
  4. NullReferenceExceptionの発生
  5. デバッグを使ったエラーの特定
  6. エラーの原因の理解
  7. エラーの修正と再実行
  8. まとめ

1. オブジェクト指向プログラミングの基本概念

1.1 クラスとオブジェクト

  • クラス:オブジェクトの設計図やテンプレートを表します。属性(データ)とメソッド(機能)を定義します。
  • オブジェクト:クラスを実体化(インスタンス化)したものです。実際のデータと機能を持ちます。

1.2 インスタンス化

  • クラスからオブジェクトを生成するプロセスをインスタンス化と呼びます。
  • インスタンス化されていないクラスのメンバーにアクセスしようとすると、NullReferenceExceptionが発生します。

2. 開発環境の準備

2.1 Visual Studioのインストール

  • Visual Studioをお持ちでない場合は、公式サイトからVisual Studio Communityをダウンロードしてインストールしてください。

2.2 新しいコンソールアプリケーションの作成

  1. Visual Studioを起動します。
  2. 「新しいプロジェクトの作成」をクリックします。
  3. プロジェクトテンプレートから「コンソール アプリ (.NET Core)」または「コンソール アプリ (.NET Framework)」を選択します。
  4. プロジェクト名を「NullReferenceConsoleApp」とします。
  5. 「作成」をクリックします。

3. クラスとオブジェクトの作成

3.1 シンプルなクラスの定義

  1. Solution ExplorerProgram.csを開きます。
  2. 以下のコードを入力して、Personクラスを定義します。
   using System;

   namespace NullReferenceConsoleApp
   {
       class Person
       {
           public string Name { get; set; }

           public void Greet()
           {
               Console.WriteLine($"こんにちは、私は{Name}です。");
           }
       }

       class Program
       {
           static Person person;

           static void Main(string[] args)
           {
               // ここにコードを追加します
           }
       }
   }

3.2 オブジェクトの生成とメソッドの呼び出し

  1. Mainメソッド内に以下のコードを追加します。
   static void Main(string[] args)
   {
       person = new Person();
       person.Name = "太郎";
       person.Greet();

       Console.ReadLine();
   }
  1. プログラムを実行すると、以下の出力が表示されます。
   こんにちは、私は太郎です。

4. NullReferenceExceptionの発生

4.1 オブジェクトを初期化しない場合

  1. Personオブジェクトの生成をコメントアウトします。
   static void Main(string[] args)
   {
       // person = new Person();
       person.Name = "太郎";
       person.Greet();

       Console.ReadLine();
   }
  1. プログラムを実行すると、NullReferenceExceptionが発生します。
   Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.

5. デバッグを使ったエラーの特定

5.1 ブレークポイントの設定

  1. person.Name = "太郎"; の行の左側の余白をクリックして、ブレークポイントを設定します。赤い丸が表示されます。

5.2 デバッグの開始

  1. メニューから「デバッグ」 > 「デバッグの開始」を選択するか、F5キーを押します。
  2. プログラムがブレークポイントで一時停止します。

5.3 変数の確認

  1. マウスをperson変数の上に移動すると、値がnullであることが表示されます。
  2. 「自動」ウィンドウでも変数の値を確認できます。

5.4 ステップ実行

  1. F10キーを押して、次の行に進みます。
  2. person.Name = "太郎"; の行で、personnullであるため、ここでNullReferenceExceptionが発生します。

6. エラーの原因の理解

  • 原因personオブジェクトがインスタンス化されていない(new Person()していない)ため、nullの状態です。そのため、person.Nameにアクセスしようとするとエラーが発生します。
  • オブジェクト指向の基本:オブジェクトを使用する前に、必ずインスタンス化してメモリ上にオブジェクトを生成する必要があります。

7. エラーの修正と再実行

7.1 オブジェクトのインスタンス化

  1. コメントアウトしたperson = new Person();の行を元に戻します。
   static void Main(string[] args)
   {
       person = new Person();
       person.Name = "太郎";
       person.Greet();

       Console.ReadLine();
   }

7.2 再度デバッグの実行

  1. 「デバッグの再開」をクリックするか、F5キーを押します。
  2. プログラムが正常に動作し、以下の出力が表示されます。
   こんにちは、私は太郎です。

7.3 確認

  • 今度はpersonが正しくインスタンス化されているため、Nameプロパティにアクセスしてもエラーが発生しません。

8. まとめ

8.1 学んだこと

  • オブジェクトのインスタンス化が必要:クラスからオブジェクトを生成しないと、そのメンバーにアクセスできません。
  • NullReferenceExceptionの原因nullのオブジェクトのメンバーにアクセスしようとすると発生します。
  • デバッグの重要性:ブレークポイントとステップ実行を使って、エラーの原因を特定できます。

8.2 Unityへの応用

  • Unityでも同様に、オブジェクトが正しく割り当てられていないとNullReferenceExceptionが発生します。
  • このコンソールアプリケーションでの学びを、Unityでの開発にも活かすことができます。

追加の練習

  • 練習1Personクラスに新しいメソッドAgeを追加し、同様にインスタンス化せずにアクセスしてエラーを発生させてみましょう。
  • 練習2:エラーを防ぐために、if文を使ってnullチェックを実装してみましょう。

参考資料


最後に

オブジェクト指向の基本を理解することで、プログラミングの幅が大きく広がります。今回のチュートリアルで学んだことを基礎として、より複雑なプログラムやUnityでのゲーム開発に挑戦してみてください。デバッグの技術も磨き続けることで、エラーの原因特定と解決がスムーズになります。

補足(ゲーム的にアバターで置き換えて考えてみましょう)


3. クラスとオブジェクトの作成

3.1 アバタークラスの定義

Solution ExplorerでProgram.csを開き、以下のコードを入力して、Avatarクラスを定義します。

using System;

public class Avatar
{
    public string Name { get; set; }

    // コンストラクタでアバターの名前を設定
    public Avatar(string name)
    {
        Name = name;
    }

    // 話すメソッド
    public void Talk(string message)
    {
        Console.WriteLine($"{Name}が {message}と言いました");
    }
}

public class Program
{
    static Avatar avatar;

    public static void Main(string[] args)
    {
        // ここにコードを追加します
    }
}

3.2 オブジェクトの生成とメソッドの呼び出し

Mainメソッド内に以下のコードを追加します。

static void Main(string[] args)
{
    avatar = new Avatar("ユミ");
    avatar.Talk("こんにちは、世界!");
    Console.ReadLine();
}

プログラムを実行すると、以下の出力が表示されます。

ユミがこんにちは、世界!と言いました

4. NullReferenceExceptionの発生

4.1 オブジェクトを初期化しない場合

Avatarオブジェクトの生成をコメントアウトします。

static void Main(string[] args)
{
    // avatar = new Avatar("ユミ");
    avatar.Talk("こんにちは、世界!");
    Console.ReadLine();
}

プログラムを実行すると、NullReferenceExceptionが発生します。(和訳)

未処理の例外: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。

C#

Posted by hidepon