variable is already defined の原因と直し方
同じスコープでの再宣言。値の変更と宣言の違いを、引数とループ変数の例で確認します。
エラーメッセージの読み方
Main.java:4: error: variable count is already defined in method main(String[])
Main.java- ファイル名
4- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
variable count is already defined in method main(String[])- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 int count = 1; 4 int count = 2; ^ 5 System.out.println(count); 6 } 7 }
Main.java:4: error: variable count is already defined in method main(String[])
同じスコープで同じ名前を2回宣言することはできません。値を変えるだけなら型を書きません。
直し方: int を (空) にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 static void show(int n) { 3 int n = 10; ^ 4 System.out.println(n); 5 } 6 public static void main(String[] args) { 7 show(1); 8 } 9 }
Main.java:3: error: variable n is already defined in method show(int)
引数もそのメソッドのスコープに属する変数です。同じ名前で再宣言はできません。
直し方: int を (空) にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 for (int i = 0; i < 3; i++) { 4 int i = 0; ^ 5 System.out.println(i); 6 } 7 } 8 }
Main.java:4: error: variable i is already defined in method main(String[])
外側のforで宣言したiは、その中の波括弧内でも有効です。同じ名前で再宣言することはできません。
直し方: int を (空) にします。
パターン4
1 public class Main { 2 public static void main(String[] args) { 3 int total = 0; 4 if (total == 0) { 5 int total = 5; ^ 6 System.out.println(total); 7 } 8 } 9 }
Main.java:5: error: variable total is already defined in method main(String[])
if文のブロックの中も外側と同じスコープの続きです。内側で外側と同じ名前を再宣言することはできません。
直し方: int を (空) にします。
パターン5
1 public class Main { 2 static void loop(int i) { 3 for (int i = 0; i < 3; i++) { ^ 4 System.out.println(i); 5 } 6 } 7 public static void main(String[] args) { 8 loop(1); 9 } 10 }
Main.java:3: error: variable i is already defined in method loop(int)
引数もそのメソッドのスコープに属します。for文の中で同じ名前を再宣言することはできません。
直し方: int を (空) にします。
よくある誤解
値を変えるだけなら型を書き直す必要はありません。型を書くと、同じ名前の別の変数が生まれます。
まとめ
variable is already definedは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。