※ この記事にはアフィリエイトリンクが含まれます
C#でプログラムを書いていて、メソッド呼び出し時にArgumentNullExceptionが発生して困っていませんか?
多くの初心者が同じエラーで立ち止まりがちです。
- どの引数が
nullで問題になっているのかわからない nullチェックの書き方が分からずコードが冗長になる
結論から言うと、ArgumentNullExceptionは引数がnullであってはならないときに発生する例外です。
適切なガード句と最新の言語機能を使えば簡潔に安全なコードにできます。
- シンプルな
nullチェックを入れる nameofを使って例外メッセージを明確にするnullable参照型やArgumentNullException.ThrowIfNullを活用する
この記事では、C#でArgumentNullExceptionが発生する理由と対処方法を、初心者向けに分かりやすく解説します。
コード例と予防策も紹介するので実務でも役立ちます。
ArgumentNullExceptionとは何か
ArgumentNullExceptionはSystem名前空間にある例外です。
メソッドに渡された引数がnullで許容されない場合に投げられます。
例えば、あるメソッドがstringを受け取り
その引数がnullだと処理できないときに、この例外を投げます。
これはプログラムのバグを早期に検出するために有効です。
なぜ発生するのか(原因)
主な原因は次の通りです。
呼び出し元がnullを渡してしまっていることがほとんどです。
- 呼び出し側の初期化漏れ
- 外部入力やAPIの戻り値が
nullの可能性を考慮していない nullable参照型を使っていない、または使い方が不適切
ArgumentNullExceptionは必ずしも悪いことではありません。
むしろ不正な引数を早期に検出して安全性を高めます。
まず押さえるべき基本の対処法
最も基本的なのはガード句(先頭でのnullチェック)を入れることです。
これにより、何が悪かったかがすぐに分かります。
典型的な書き方は次の通りです。nameofを使うことで、引数名をミスなく指定できます。
// 伝統的なnullチェックの例
public void PrintName(string name)
{
if (name == null)
throw new ArgumentNullException(nameof(name));
Console.WriteLine(name);
}より簡潔なパターン(C#6以降)
三項演算子やnull合体演算子を使って短く書く方法もあります。
可読性を優先して使い分けましょう。
// 短く書く例
public void PrintName(string name)
{
name = name ?? throw new ArgumentNullException(nameof(name));
Console.WriteLine(name);
}.NET 6以降で使える ThrowIfNull
.NET 6以降ではArgumentNullException.ThrowIfNullが使えます。
ガード句を更に短く、安全に書けます。
// .NET 6以降の推奨パターン
public void PrintName(string name)
{
ArgumentNullException.ThrowIfNull(name, nameof(name));
Console.WriteLine(name);
}ThrowIfNullは内部で最適化されており、可読性とパフォーマンスのバランスが良いです。
可能ならこちらを採用すると良いでしょう。
実際に遭遇するパターンと読み方
デバッグ時にArgumentNullExceptionが発生したらスタックトレースを確認します。
例外メッセージに引数名が含まれていることが多く、原因特定が早まります。
例えば次のような例外メッセージが出ます。"Value cannot be null. (Parameter 'name')" という形です。
Unhandled exception. System.ArgumentNullException: Value cannot be null. (Parameter 'name')
at MyNamespace.MyClass.PrintName(String name)
at MyNamespace.Program.Main()
この情報からPrintNameメソッドのname引数にnullが渡されたことが分かります。
呼び出し元のどこでnullが発生したかを追いかけましょう。
Nullable参照型を使った設計(予防策)
C# 8.0以降のnullable参照型を有効にすると
コンパイル時にnull許容や非許容を明示できます。
null許容の型はstring?、許容しない型はstringと書きます。
これによりArgumentNullExceptionの発生を未然に防げる場合があります。
#nullable enable
public void PrintName(string name)
{
// コンパイラがnameがnullでないことを保証するならチェック不要
Console.WriteLine(name);
}
#nullable disableただしnullable参照型は万能ではありません。
外部APIや古いライブラリの戻り値には依然としてnullが混入する可能性があります。
そのためランタイムチェックも併用するのが安全です。
ライブラリや公開APIの場合の注意点
自分が公開するライブラリやAPIでは、引数検証を厳格に行いましょう。
ドキュメント(XMLコメント)でnull許容かどうかを明示すると親切です。
例外メッセージにはnameofを使い、呼び出し元が修正しやすい情報を与えます。
また、ユニットテストでnullを渡すケースをカバーしておくと安心です。
ユニットテスト例
[Fact]
public void PrintName_Null_ThrowsArgumentNullException()
{
var obj = new MyClass();
Assert.Throws<argumentnullexception>(() => obj.PrintName(null));
}
</argumentnullexception>実践的な対処フロー
ArgumentNullExceptionに遭遇したときのステップを示します。
順番に確認していけば原因特定が速くなります。
- 例外メッセージとスタックトレースを読む
- 該当メソッドの引数チェックを確認する
- 呼び出し元で
nullが入る可能性を探る - 必要ならガード句や
ThrowIfNullを追加する - ユニットテストとドキュメントを更新する
このフローを習慣化すれば、同様のバグを繰り返しにくくなります。
チームでコーディング規約として統一するのもおすすめです。
よくある誤解と落とし穴
ArgumentNullExceptionを無視してcatchで握りつぶすのは避けましょう。
本来はバグのサインであり、適切に修正するべきです。
また、単にnullを使わないようにするだけでなく
どの引数がnullが許容されるかをAPI設計で明確にする必要があります。
まとめ
C#のArgumentNullExceptionは、引数がnullであってはならない場面で発生します。
発生したらスタックトレースとメッセージを確認し、ガード句やThrowIfNullで対処してください。
nullable参照型やnameof、ユニットテストを組み合わせることで
再発を防ぎ、読みやすく堅牢なコードが書けるようになります。
この記事を参考に、小さなバグを早期発見できる習慣を身につけてください。
C#での開発がよりスムーズになります。

#エンジニアとして、もっと自分の力を活かしたいあなたへ
「このまま今の職場にいて、成長できるんだろうか?」
C#を使っている方なら、一度はそう感じたことがあるかもしれません。
実は今、C#/.NETエンジニアの市場価値は高まっており、
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。
もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。
現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

ここまで読んでいただきありがとうございました。
コメント