【C#】NullReferenceExceptionを発生させてVisual Studioで解決する方法
Unityでの開発において、NullReferenceExceptionは頻繁に遭遇するエラーですが、その背後にはオブジェクト指向の基本的な概念が関わっています。オブジェクト指向の基礎を理解していないと、エラーの原因や対処法が分からず、ただ手順を追うだけの作業になりがちです。
このチュートリアルでは、コンソールアプリケーションを使って、オブジェクト指向の基本とNullReferenceException
の原因と対処法を理解することを目指します。
目次
- オブジェクト指向プログラミングの基本概念
- 開発環境の準備
- クラスとオブジェクトの作成
- NullReferenceExceptionの発生
- デバッグを使ったエラーの特定
- エラーの原因の理解
- エラーの修正と再実行
- まとめ
1. オブジェクト指向プログラミングの基本概念
1.1 クラスとオブジェクト
- クラス:オブジェクトの設計図やテンプレートを表します。属性(データ)とメソッド(機能)を定義します。
- オブジェクト:クラスを実体化(インスタンス化)したものです。実際のデータと機能を持ちます。
1.2 インスタンス化
- クラスからオブジェクトを生成するプロセスをインスタンス化と呼びます。
- インスタンス化されていないクラスのメンバーにアクセスしようとすると、
NullReferenceException
が発生します。
2. 開発環境の準備
2.1 Visual Studioのインストール
- Visual Studioをお持ちでない場合は、公式サイトからVisual Studio Communityをダウンロードしてインストールしてください。
2.2 新しいコンソールアプリケーションの作成
- Visual Studioを起動します。
- 「新しいプロジェクトの作成」をクリックします。
- プロジェクトテンプレートから「コンソール アプリ (.NET Core)」または「コンソール アプリ (.NET Framework)」を選択します。
- プロジェクト名を「NullReferenceConsoleApp」とします。
- 「作成」をクリックします。
3. クラスとオブジェクトの作成
3.1 シンプルなクラスの定義
- Solution ExplorerでProgram.csを開きます。
- 以下のコードを入力して、
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 オブジェクトの生成とメソッドの呼び出し
Main
メソッド内に以下のコードを追加します。
static void Main(string[] args)
{
person = new Person();
person.Name = "太郎";
person.Greet();
Console.ReadLine();
}
- プログラムを実行すると、以下の出力が表示されます。
こんにちは、私は太郎です。
4. NullReferenceExceptionの発生
4.1 オブジェクトを初期化しない場合
Person
オブジェクトの生成をコメントアウトします。
static void Main(string[] args)
{
// person = new Person();
person.Name = "太郎";
person.Greet();
Console.ReadLine();
}
- プログラムを実行すると、
NullReferenceException
が発生します。
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
5. デバッグを使ったエラーの特定
5.1 ブレークポイントの設定
person.Name = "太郎";
の行の左側の余白をクリックして、ブレークポイントを設定します。赤い丸が表示されます。
5.2 デバッグの開始
- メニューから「デバッグ」 > 「デバッグの開始」を選択するか、
F5
キーを押します。 - プログラムがブレークポイントで一時停止します。
5.3 変数の確認
- マウスを
person
変数の上に移動すると、値がnull
であることが表示されます。 - 「自動」ウィンドウでも変数の値を確認できます。
5.4 ステップ実行
F10
キーを押して、次の行に進みます。person.Name = "太郎";
の行で、person
がnull
であるため、ここでNullReferenceException
が発生します。
6. エラーの原因の理解
- 原因:
person
オブジェクトがインスタンス化されていない(new Person()
していない)ため、null
の状態です。そのため、person.Name
にアクセスしようとするとエラーが発生します。 - オブジェクト指向の基本:オブジェクトを使用する前に、必ずインスタンス化してメモリ上にオブジェクトを生成する必要があります。
7. エラーの修正と再実行
7.1 オブジェクトのインスタンス化
- コメントアウトした
person = new Person();
の行を元に戻します。
static void Main(string[] args)
{
person = new Person();
person.Name = "太郎";
person.Greet();
Console.ReadLine();
}
7.2 再度デバッグの実行
- 「デバッグの再開」をクリックするか、
F5
キーを押します。 - プログラムが正常に動作し、以下の出力が表示されます。
こんにちは、私は太郎です。
7.3 確認
- 今度は
person
が正しくインスタンス化されているため、Name
プロパティにアクセスしてもエラーが発生しません。
8. まとめ
8.1 学んだこと
- オブジェクトのインスタンス化が必要:クラスからオブジェクトを生成しないと、そのメンバーにアクセスできません。
- NullReferenceExceptionの原因:
null
のオブジェクトのメンバーにアクセスしようとすると発生します。 - デバッグの重要性:ブレークポイントとステップ実行を使って、エラーの原因を特定できます。
8.2 Unityへの応用
- Unityでも同様に、オブジェクトが正しく割り当てられていないと
NullReferenceException
が発生します。 - このコンソールアプリケーションでの学びを、Unityでの開発にも活かすことができます。
追加の練習
- 練習1:
Person
クラスに新しいメソッド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: オブジェクト参照がオブジェクト インスタンスに設定されていません。
ディスカッション
コメント一覧
まだ、コメントがありません