1. ホーム
  2. java

[解決済み】「error: '.class' expected」の意味と修正方法について

2022-01-23 09:10:11

質問事項

時々、新規ユーザーが以下のような分かりにくいコンパイルエラーに遭遇することがあります。 '.class' expected :

double d = 1.9;
int i = int d;  // error here
         ^
error: '.class' expected

Java IDE コンパイラの中には、これを少し違った形で表現するものがあります。

error: insert ". class" to complete Expression 

次のようなエラーはどうなるのでしょうか? 実際の意味は また、その原因は何なのか、どのように修正すればよいのでしょうか?

どのように解決するのか?

まず、これはコンパイルエラーです。 もし、このメッセージが 実行時間 コンパイルエラーがあるコードを実行している可能性があります。

以下に、エラーの例をいくつか示します。

double d = 1.9;
int i = int d;  // error here
         ^

int j = someFunction(int[] a);  // error here
                       ^

どちらの場合も、コンパイラのエラーメッセージは error: '.class' expected .

エラーメッセージの意味と原因について教えてください。

コンパイラは、シンタックスチェックの際に、(率直に言って)無意味なコードによってかなり混乱しています。 コンパイラは、ある型(たとえば int または int[] ) を、実際に式を期待しているコンテキストで使用することができます。 つまり、この時点で構文的に許容できる記号は . に続いて class .

以下は、この構文が正しい場合の例です。

Class<?> clazz = int;         // incorrect
Class<?> clazz = int.class;   // correct!

注:常に 可能 を把握することです。 何故 コンパイラのシンタックスチェッカーが、この型は式であるべきだと考えているからです。 しかし、多くの場合、これを「コンパイラが混乱している」とだけ考えて、混乱の原因となった(避けられない!)構文エラーを探す方が簡単です。 その構文エラーは、初心者にはわからないかもしれませんが、これが根本的な原因であることを知ることは、良いスタートとなります。

どうやって直すの?

残念ながら、quot;quot; の提案で .class は、ほとんどの場合正しくありません。 この回答の最初にある2つの例では、確かに役に立ちませんね。

実際の修正は、あなたがそこに型を置くことで何を達成しようとしたのかによります。

  • を書くつもりだったのなら タイプキャスト のように、型を丸括弧で囲む必要があります。

    double d = 1.9;
    int i = (int) d;   // Correct: casts `1.9` to an integer
    
    
  • 単に値を代入したり、パラメータをそのまま渡すつもりだったのであれば、型は削除すべきです。

    int j = someFunction(a);  // Correct ... assuming that the type of
                              // 'a' is suitable for that call.
    
    

    の型を指定する必要があります。 形式パラメータ メソッドを宣言するとき。 しかし、通常、メソッドに指定する必要はありません。 実引数 . まれに(オーバーロードのあいまいさを解消するために)必要な場合は、型キャストを使用します。

その他の例

someMethod(array[]);

でエラーが報告されます。 array[] というのも、これは式ではなく型だからです。 訂正はおそらくどちらかでしょう。

someMethod(array);                  // pass ref to the entire array

または

someMethod(array[someExpression]);  // pass a single array element


int i = someMethod(int j); 

プログラマは、パラメータ宣言をメソッド コール . ここでは、宣言ではなく、式が必要です。

int i = someMethod(j);


int i = int(2.0);

プログラマーはタイプキャストを行おうとしていたのです。 このように書くべきでしょう。

int i = (int) 2.0;


int[]; letterCount = new int[26];

プログラマーは、偽のセミコロンを追加しています。 本来はこのように書くべきでしょう。

int[] letterCount = new int[26];


if (someArray[] > 80) {
    // ...
}

someArray[] は式ではなく型を表します。 プログラマーはおそらく次のようなことを意味しているのだろう。 someArray[someIndex] > 80 または someArray.length > 80 .


int[] integers = new int[arraySize];
...
return integers[];

integers[] は型宣言子を表しますが、式が必要です。 式は以下のいずれかでなければならない。

return integers;             // Return the entire array
                        

または

return integers[someIndex];  // Return one element of the array


if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50))
    double cur = acnt_balc - (withdraw + 0.50);
    System.out.println(cur);
else
    System.out.println(acnt_balc);

ここでの間違いは、"then"文の周りに中括弧があることです。

if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50)) {
    double cur = acnt_balc - (withdraw + 0.50);
    System.out.println(cur);
} else {
    System.out.println(acnt_balc);
}

しかし、コンパイラが混乱しているのは、"if" の "then" 節が変数宣言ではありえないということです。 そこでパーサーは、メソッド呼び出しとなりうる式を探すことになる。 たとえば、次のようにすると、局所的に構文的に有効になります。

if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50))
    double.class.newInstance();   // no compilation error here

...やろうとしていることは無意味なことではありますが。 そしてもちろん、コンパイラはこのダングリングな else .