cannot find symbol (variable) の原因と直し方
変数名のタイプミス、宣言忘れ、スコープ外参照の3パターンに分けて原因を切り分けます。
エラーメッセージの読み方
Main.java:4: error: cannot find symbol
Main.java- ファイル名
4- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
cannot find symbol- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 int total = 10; 4 System.out.println(totals); ^ 5 } 6 }
Main.java:4: error: cannot find symbol
symbol: variable totals
Javaは大文字小文字を区別します。宣言した名前と1文字でも違えば別の変数として扱われます。
直し方: totals を total にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 x = 5; ^ 4 System.out.println(x); 5 } 6 }
Main.java:3: error: cannot find symbol
symbol: variable x
Javaは変数を使う前に型とともに宣言する必要があります。代入だけでは変数は生まれません。
直し方: x を int x にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 if (true) { 4 int inner = 1; 5 } 6 System.out.println(inner ); ^ 7 } 8 }
Main.java:6: error: cannot find symbol
symbol: variable inner
波括弧の中で宣言した変数は、その括弧を出た時点で消えます。これをスコープと呼びます。
直し方: inner を "done" にします。
パターン4
1 public class Main { 2 static void setup() { 3 int total = 100; 4 } 5 public static void main(String[] args) { 6 System.out.println(total ); ^ 7 } 8 }
Main.java:6: error: cannot find symbol
symbol: variable total
メソッドの中で宣言したローカル変数は、そのメソッドの外からは見えません。別のメソッドの変数を直接使うことはできません。
直し方: total を 100 にします。
パターン5
1 public class Main { 2 public static void main(String[] args) { 3 for (int i = 0; i < 3; i++) { 4 System.out.println(i); 5 } 6 System.out.println(i ); ^ 7 } 8 }
Main.java:6: error: cannot find symbol
symbol: variable i
for文のかっこの中で宣言した変数は、そのfor文の中だけで使えます。ループを抜けると消えます。
直し方: i を "done" にします。
よくある誤解
cannot find symbol を「ライブラリが足りない」と読む人が多いですが、9割はタイプミスかスコープ外の参照です。import を疑う前に綴りを見てください。
まとめ
cannot find symbol (variable)は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。