有时,新用户会遇到以下相当晦涩的编译错误'.class' expected
:
double d = 1.9;
int i = int d; // error here
^
error: '.class' expected
一些Java IDE编译器对此声明略有不同;例如,
error: insert ". class" to complete Expression
这样的错误实际上是什么意思,是什么原因导致的,以及如何解决这些问题?
请注意,这是一个自我解答的问题,旨在帮助和教育第一次遇到此问题的人。有很多现有问题,带有此错误消息的特定示例,但没有一个答案可以真正解释该消息的真实含义。
答案 0 :(得分:4)
首先,这是一个编译错误。如果您在 runtime 看到消息,则可能是正在运行的代码具有编译错误。
以下是错误的几个示例:
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!
注意:找出为什么的编译器语法检查器认为类型应该是表达式,应该总是可能。但是,将其视为“编译器已混淆”并查找引起混淆的(不可避免的!)语法错误通常更简单。对于初学者来说,语法错误可能并不明显……但是知道这是根本原因是一个好的开始。
不幸的是,添加.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] > 80
或someArray.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
。