Code Fix

上級

TypeInitializationException の原因と直し方

静的コンストラクタ(staticフィールドの初期化を含む)の中で例外が起きると、直接の例外ではなくTypeInitializationExceptionに包まれて報告されます。

エラーメッセージの読み方

Unhandled exception. System.TypeInitializationException: The type initializer for 'Settings' threw an exception.
System
名前空間 — System なら標準の基本例外です
TypeInitializationException
例外クラス — 何が起きたか。ここを検索するのが最短です
The type initializer for 'Settings' threw an exception.
詳細メッセージ — どの値が問題だったか
at Settings..cctor() in Program.cs:line 5
発生箇所 — スタックトレースの先頭行

このエラーが出る典型パターン

パターン1

 1  class Settings {
 2      public static int Value;
 3      static Settings() {
 4          int denom = 0;
                        ^
 5          Value = 100 / denom;
 6      }
 7  }
 8  class Program {
 9      static void Main(string[] args) {
10          System.Console.WriteLine(Settings.Value);
11      }
12  }
Unhandled exception. System.TypeInitializationException: The type initializer for 'Settings' threw an exception. at Settings..cctor() in Program.cs:line 5

静的コンストラクタの中で例外が起きると、直接の例外ではなくTypeInitializationExceptionに包まれて報告されます。原因は内側のInnerExceptionにあります。

直し方: 02 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  class Catalog {
 2      public static string FirstItem;
 3      static Catalog() {
 4          string[] items = { "pen", "cup" };
 5          FirstItem = items[5 ];
                               ^
 6      }
 7  }
 8  class Program {
 9      static void Main(string[] args) {
10          System.Console.WriteLine(Catalog.FirstItem);
11      }
12  }
Unhandled exception. System.TypeInitializationException: The type initializer for 'Catalog' threw an exception. at Catalog..cctor() in Program.cs:line 5

IndexOutOfRangeExceptionのような別の例外でも、静的コンストラクタ内で起きた時点でTypeInitializationExceptionに包まれます。

直し方: 50 にします。

この問題を解いてみる →

パターン3

 1  class Parser {
 2      public static int Parsed;
 3      static Parser() {
 4          Parsed = int.Parse("N/A");
                                 ^
 5      }
 6  }
 7  class Program {
 8      static void Main(string[] args) {
 9          System.Console.WriteLine(Parser.Parsed);
10      }
11  }
Unhandled exception. System.TypeInitializationException: The type initializer for 'Parser' threw an exception. at Parser..cctor() in Program.cs:line 4

FormatExceptionが原因でも同じです。静的コンストラクタの中で投げられた例外は種類を問わずTypeInitializationExceptionに包まれます。

直し方: "N/A""42" にします。

この問題を解いてみる →

よくある誤解

スタックトレースの一番外側だけを見るとTypeInitializationExceptionが原因に見えますが、本当の原因は「--->」で示される内側の例外(InnerException)にあります。

まとめ

TypeInitializationExceptionは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)