HOWTO · Java

Javaの「.class expected」コンパイラエラー

このガイドでは、Javaコンパイラの診断メッセージ「.class expected」が示す内容と、例での修正方法を説明します。

このページの内容

Javaコンパイラの .class expected という診断は、指摘されたすべての行に .class リテラルを追加すべきだという意味ではありません。意味はソースコードの文脈によって異なります。以下の例で問題となるのは sorting[] という引数です。Javaでは int[] のような配列型に [] を使いますが、メソッドに渡す式は既存の変数 sorting です。

.class expected エラーの意味

これはコンパイル時の診断です。プログラムを実行する前に、ソースコードの解析中またはコンパイル中にコンパイラが報告します。コンパイラのメッセージには、ソースの行番号と解析が止まった位置を示す印が含まれることがあります。その位置は手掛かりになりますが、原因は印の直前にある場合もあります。たとえば、予期しない括弧や区切り記号の不足などです。

.class expected という語句は、その解析状況でコンパイラが何を期待していたかを示します。原因が常に一つだと断定するものではなく、Javaの構文上の問題がすべてこの診断になるという意味でもありません。ここで関係するのは Arrays.sort に渡す配列引数です。変数はすでに配列の値を表しているため、その後ろに空の角括弧を付ける構文は式として無効です。

sorting[] でエラーを再現する

注目すべき箇所は sorting[] という式です。宣言の int[] sorting では、角括弧は配列型の一部です。メソッド呼び出しで sorting と書くと、配列オブジェクトを参照します。角括弧は、配列の型を渡したり、新しい配列を作成したりするためのものではありません。

たとえば、次の呼び出しには誤りがあります。Arrays.sort(sorting[]);。提示されたコンパイラ診断は .class expected ですが、正確な文言や行番号はJavaコンパイラのバージョンや周囲のソースコードによって異なる場合があります。重要な手掛かりは、印が無効な引数を指していることです。そこに .class を追加すると式が変わるだけで、配列をソートできるようにはなりません。

配列引数を修正する

配列変数そのものを渡します。Arrays.sort(sorting);。次の完全なプログラムは修正後の書き方を示しています。ローカル配列を使ってその場でソートし、値を表示用の文字列に変換します。

この例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] sorting = {3, 1, 2};
        Arrays.sort(sorting);
        System.out.println(Arrays.toString(sorting));
    }
}
[1, 2, 3]

Arrays.sort は配列の値を受け取り、ソート後も同じ変数がその配列を参照します。重要な修正点は、配列の宣言を変えたりクラスリテラルを追加したりすることではなく、引数末尾の [] を削除することです。

空の配列もこのオーバーロードに渡せます。この修正済みの例は実行に成功し、空のリストを出力しました。

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] sorting = {};
        Arrays.sort(sorting);
        System.out.println(Arrays.toString(sorting));
    }
}
[]

要素がない場合も、同じ呼び出しに配列変数を渡せます。宣言では引き続き int[] を使い、メソッドの引数には sorting を渡します。

コンパイラが示す位置を調べる

診断が表示されたら、次の短い手順で確認します。

  1. コンパイラのメッセージ全体を読み、ファイル名、行番号、印の位置を確認します。元の誤りより後で解析が止まることもあるため、印は調査の出発点として扱います。
  2. その行と直前の行を確認します。角括弧、丸括弧、カンマ、セミコロンが周囲の式と正しく対応しているかを調べます。
  3. コードが型を宣言しているのか、値を使っているのかを見分けます。int[] sorting は宣言で、Arrays.sort(sorting) は変数を使うメソッド呼び出しです。
  4. 式がメソッドの引数として適切かを確認します。この例では Arrays.sort に配列への参照を渡します。変数の後ろに角括弧を付ける構文ではありません。
  5. 編集後に再コンパイルし、新たな診断があれば読みます。最初に報告された問題を修正してから同じ手順を繰り返します。一つの構文上の問題が後続の問題を見えにくくすることがあります。

コンパイラが示す位置やソースコードから裏付けられない限り、余分な波括弧、メソッドの配置、インポート、ファイル名の不一致がこの診断の原因だと決めつけないでください。これらは別のコンパイルエラーを引き起こす場合があります。一般的な .class の修正を当てはめず、実際のソースとメッセージに基づいて調べてください。

修正したプログラムを確認する

引数を sorting に変更したら、プロジェクトとインストール済みのJDKに合ったコマンドでソースをコンパイルし、クラスを実行します。プログラムのソート処理は配列をその場で変更し、Arrays.toString は要素を読みやすい文字列に変換します。提示された実行証拠では、修正後の二つの例はいずれも正常に実行されています。要素がある配列は [1, 2, 3]、空の配列は [] と出力されました。この証拠が示すのは修正後の呼び出しだけであり、誤った sorting[] の呼び出しが実行されたことを示すものではありません。

同じ診断が残る場合は、編集したファイルが実際にコンパイルされているか、報告された行番号が現在のソースと一致しているかを確認してください。続いて、近くの句読点と、開き括弧から閉じ括弧までの呼び出し全体を調べます。コンパイラの文言や行番号はバージョンによって異なることがあるため、メッセージだけに頼らずコードと合わせて判断してください。この例の修正方法は変わりません。型の宣言では [] を使い、配列変数は sorting として渡します。