Code Fix

初級

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は値が入らない経路があると判断します。

直し方: resultn にします。

この問題を解いてみる →

パターン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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

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