variable might not have been initialized の原因と直し方
ローカル変数は自動で初期化されません。javacがどの経路を「値が入らない道」と判定するかを解説します。
エラーメッセージの読み方
Main.java:4: error: variable x might not have been initialized
Main.java- ファイル名
4- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
variable x might not have been initialized- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 int x ; ^ 4 System.out.println(x); 5 } 6 }
Main.java:4: error: variable x might not have been initialized
ローカル変数は自動で0になりません。使う前に必ず値を入れる必要があります(フィールドとは違う点です)。
直し方: (空) を = 0 にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 int result; 4 if (args.length > 0) { 5 result = 1; 6 } ^ 7 System.out.println(result); 8 } 9 }
Main.java:7: error: variable result might not have been initialized
javacは「通らない可能性のある経路」を検出します。ifだけでは値が入らない道が残るため拒否されます。
直し方: (空) を else { result = 0; } にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 String msg ; ^ 4 System.out.println(msg.length()); 5 } 6 }
Main.java:4: error: variable msg might not have been initialized
参照型でも初期化は必須です。なお null を入れると今度は実行時にNullPointerExceptionになります。
直し方: (空) を = "" にします。
パターン4
1 public class Main { 2 public static void main(String[] args) { 3 int result; 4 int n = 0; 5 while (n < 3) { 6 result = n; 7 n++; 8 } 9 System.out.println(result); ^ 10 } 11 }
Main.java:9: error: variable result might not have been initialized
whileが1度も実行されない可能性がある限り、javacは値が入らない経路があると判断します。
直し方: result を n にします。
パターン5
1 public class Main { 2 public static void main(String[] args) { 3 int day = 2; 4 String name; 5 switch (day) { 6 case 1: name = "Mon"; break; 7 case 2: name = "Tue"; break; 8 } 9 System.out.println(name); ^ 10 } 11 }
Main.java:9: error: variable name might not have been initialized
switchにdefaultが無いと、どのcaseにも一致しない場合の経路が残ります。javacはその可能性を見逃しません。
直し方: name を "?" にします。
よくある誤解
フィールドは自動で0になりますが、ローカル変数はなりません。この非対称が混乱の元です。
まとめ
variable might not have been initializedは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。