MeWrite Docs

NullReferenceException

null参照のオブジェクトにアクセスした場合に発生するC#の例外

概要

System.NullReferenceExceptionは、C#で最も頻繁に発生する例外の1つです。値がnullのオブジェクト参照に対してメンバーアクセスを行った場合に発生します。

エラーメッセージ

System.NullReferenceException: Object reference not set to an instance of an object.
   at MyApp.Program.Main(String[] args) in Program.cs:line 12

原因

  1. 初期化されていない変数: オブジェクトを初期化せずにメンバーにアクセスしている
  2. メソッドの戻り値がnull: nullを返す可能性があるメソッドの結果をそのまま使用
  3. LINQの結果がnull: FirstOrDefault()等がnullを返した結果をそのまま使用
  4. JSONデシリアライズ: デシリアライズ結果のプロパティがnullになっている

解決策

1. null条件演算子(?.)を使用する

nullの可能性がある参照に安全にアクセスする。

1
2
3
4
5
6
7
8
// NG: nullの場合にNullReferenceException
string name = user.Address.City.ToUpper();

// OK: null条件演算子で安全にアクセス
string? name = user?.Address?.City?.ToUpper();

// null合体演算子(??)でデフォルト値を設定
string name = user?.Address?.City?.ToUpper() ?? "不明";

2. nullable参照型を有効にする(C# 8.0以降)

コンパイラにnullの可能性を検出させる。

1
2
3
4
<!-- .csprojファイル -->
<PropertyGroup>
    <Nullable>enable</Nullable>
</PropertyGroup>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// nullable参照型が有効な場合
public class User
{
    public string Name { get; set; } = string.Empty; // non-null
    public string? Email { get; set; }                // nullable

    public void PrintEmail()
    {
        // コンパイラ警告: Email は null の可能性がある
        // Console.WriteLine(Email.ToUpper());

        // OK: nullチェック付き
        if (Email is not null)
        {
            Console.WriteLine(Email.ToUpper());
        }
    }
}

3. LINQでnullを安全に扱う

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
var users = GetUsers();

// NG: 結果がない場合にNullReferenceException
var user = users.FirstOrDefault();
Console.WriteLine(user.Name); // userがnullの可能性

// OK: nullチェックを行う
var user = users.FirstOrDefault();
if (user is not null)
{
    Console.WriteLine(user.Name);
}

// OK: パターンマッチングを使用
if (users.FirstOrDefault() is User foundUser)
{
    Console.WriteLine(foundUser.Name);
}

// OK: null合体演算子でデフォルト値
var name = users.FirstOrDefault()?.Name ?? "ゲスト";

4. ArgumentNullExceptionでガード句を実装する

メソッドの入口でnullチェックを行う。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// .NET 6以前
public void Process(string input)
{
    if (input is null)
        throw new ArgumentNullException(nameof(input));

    // 処理
}

// .NET 7以降(簡潔な書き方)
public void Process(string input)
{
    ArgumentNullException.ThrowIfNull(input); // .NET 7以降

    // 処理
}

5. required修飾子を使用する(C# 11以降)

オブジェクト初期化時のnull忘れを防ぐ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
public class Config
{
    public required string ConnectionString { get; init; }
    public required string ApiKey { get; init; }
}

// コンパイルエラー: requiredプロパティが未設定
// var config = new Config();

// OK: すべてのrequiredプロパティを設定
var config = new Config
{
    ConnectionString = "Server=localhost;Database=mydb",
    ApiKey = "abc123"
};

関連エラー

C# の他のエラー

最終更新: 2026-02-03