C# を使っていると頻繁に遭遇するのが「null参照エラー(NullReferenceException)」です。これは、オブジェクトが存在しない(null の状態)にもかかわらず、そのメンバーにアクセスしようとしたときに発生します。本記事では、null参照エラーの原因と代表的な解決方法を解説します。
null参照エラーが発生する原因
NullReferenceException
は、インスタンスが生成されていないのにプロパティやメソッドへアクセスしたときに発生します。
class Program
{
static void Main()
{
string text = null;
Console.WriteLine(text.Length); // ★ NullReferenceException
}
}
この場合、text
が null であるため Length
プロパティを参照できず、エラーになります。
よくある原因の例
- インスタンスを生成し忘れている
- メソッドから null が返ってきている
- 配列やリストの要素が null のまま利用されている
- 外部リソースからのデータ取得に失敗して null が返っている
解決方法1:インスタンスを生成する
最も基本的な対策は、必要なオブジェクトを必ず new
で生成してから使うことです。
string text = null;
// null のまま使うとエラー
// Console.WriteLine(text.Length);
// インスタンスを生成してから利用
text = string.Empty;
Console.WriteLine(text.Length); // 0
解決方法2:nullチェックを行う
変数を使う前に null かどうかを確認すれば、安全に処理できます。
string text = null;
if (text != null)
{
Console.WriteLine(text.Length);
}
else
{
Console.WriteLine("値が設定されていません");
}
解決方法3:null 条件演算子(?.)を使う
C# 6.0 以降では「null 条件演算子」を使って、null の場合に自動的に処理をスキップできます。
string text = null;
// ?. を使うと null の場合は安全にスキップされる
Console.WriteLine(text?.Length); // 出力されない(null のまま)
解決方法4:null 合体演算子(??)を使う
null の場合に代わりの値を設定したいときは「null 合体演算子」が便利です。
string text = null;
// null の場合は右側の値を使う
string result = text ?? "デフォルト値";
Console.WriteLine(result); // デフォルト値
解決方法5:C# 8.0 の nullable 参照型を活用
C# 8.0 以降では nullable
参照型を有効にすることで、コンパイル時に「null の可能性がある変数」を警告してくれます。
#nullable enable
string? text = null; // null を許容
Console.WriteLine(text?.Length); // null 安全に処理
まとめ
null参照エラーは C# 初心者から上級者まで悩まされる代表的なエラーですが、以下を意識すれば回避できます。
- インスタンスを必ず生成してから使う
- null チェックや
?.
・??
を活用する - C# 8.0 以降では nullable 参照型で設計段階から防止する
適切に null を扱うことで、堅牢でエラーに強いプログラムを作成できます。