length / length() / size() の使い分け
配列はフィールド、Stringはメソッド、コレクションはsize()。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[] nums = {1, 2, 3}; 4 System.out.println(nums.length()); ^ 5 } 6 }
Main.java:4: error: cannot find symbol
symbol: method length()
配列のlengthはフィールドなので括弧を付けません。Stringのlength()はメソッドで括弧が要ります。
直し方: length() を length にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 String s = "java"; 4 System.out.println(s.length ); ^ 5 } 6 }
Main.java:4: error: cannot find symbol
symbol: variable length
Stringのlength()はメソッドです。配列のlengthと紛らわしいので、対比で覚えると定着します。
直し方: length を length() にします。
パターン3
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class Main { 5 public static void main(String[] args) { 6 List<String> list = new ArrayList<>(); 7 list.add("a"); 8 System.out.println(list.length()); ^ 9 } 10 }
Main.java:8: error: cannot find symbol
symbol: method length()
コレクションの要素数はsize()です。配列はlength、Stringはlength()、コレクションはsize()と3種類あります。
直し方: length() を size() にします。
パターン4
1 import java.util.HashMap; 2 import java.util.Map; 3 4 public class Main { 5 public static void main(String[] args) { 6 Map<String, Integer> m = new HashMap<>(); 7 m.put("a", 1); 8 System.out.println(m.length ); ^ 9 } 10 }
Main.java:8: error: cannot find symbol
symbol: variable length
Mapの要素数もsize()です。lengthは配列専用のフィールドで、コレクション全般には使えません。
直し方: length を size() にします。
パターン5
1 public class Main { 2 public static void main(String[] args) { 3 int[][] grid = {{1,2,3},{4,5}}; 4 System.out.println(grid[0].length()); ^ 5 } 6 }
Main.java:4: error: cannot find symbol
symbol: method length()
2次元配列でも、各行は1つの配列です。行の要素数を取るのも括弧なしのlengthです。
直し方: length() を length にします。
よくある誤解
覚え方を工夫するより、エラーが出たら括弧の有無を疑う習慣を作るほうが速く直せます。
実務での勘所
この不統一は設計ミスというより歴史的な経緯です。配列はJavaの最初期からJVMに組み込まれた特別な構造で、lengthはメソッド呼び出しですらなく、JVMバイトコードレベルの専用命令(arraylength)で直接取得される値です。一方Stringやコレクションは通常のクラスとして後から設計されたため、ふつうのメソッド呼び出し(length()やsize())になっています。配列だけ特別な理由は、パフォーマンスを最優先した初期のJVM設計に由来します。