“错误:预期为'.class'”是什么意思,我该如何解决

时间:2018-12-17 06:22:17

标签: java compiler-errors

有时,新用户会遇到以下相当晦涩的编译错误'.class' expected

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

一些Java IDE编译器对此声明略有不同;例如,

error: insert ". class" to complete Expression 

这样的错误实际上是什么意思,是什么原因导致的,以及如何解决这些问题?


请注意,这是一个自我解答的问题,旨在帮助和教育第一次遇到此问题的人。有很多现有问题,带有此错误消息的特定示例,但没有一个答案可以真正解释该消息的真实含义。

1 个答案:

答案 0 :(得分:4)

首先,这是一个编译错误。如果您在 runtime 看到消息,则可能是正在运行的代码具有编译错误。

以下是错误的几个示例:

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

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

在两种情况下,编译器错误消息均为error: '.class' expected

错误消息是什么意思,导致错误的原因是什么?

坦率地说,编译器在语法检查过程中被一些毫无意义的代码弄糊涂了。编译器在实际上期望表达式的上下文中遇到了类型(例如intint[])。这就是说,在语法上可接受的唯一符号是.,后跟class

以下是该语法正确的示例;

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

注意:找出为什么的编译器语法检查器认为类型应该是表达式,应该总是可能。但是,将其视为“编译器已混淆”并查找引起混淆的(不可避免的!)语法错误通常更简单。对于初学者来说,语法错误可能并不明显……但是知道这是根本原因是一个好的开始。

您如何解决?

不幸的是,添加.class的“建议”几乎总是不正确的。在本答案开头的两个示例中肯定没有帮助!

实际的修复方法取决于您尝试通过在此处放置类型来实现的目标。

  • 如果打算编写 type强制转换,则需要在类型周围加上括号(圆括号)。例如

    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 = int(2.0);

程序员正在尝试进行类型转换。应该这样写:

int i = (int) 2.0;

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

程序员添加了一个虚假的分号。应该这样写:

int[] letterCount = new int[26];

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

someArray[]表示类型而不是表达式。程序员可能表示someArray[someIndex] > 80someArray.length > 80之类的东西。


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