Code Fix

中級

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設計に由来します。

演習をはじめる

関連するエラー

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