首先,这是一个编译错误。如果您在 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 的“建议”几乎总是不正确的。在本答案开头的两个示例中肯定无济于事!
实际的修复取决于您通过将类型放在那里试图实现的目标。
-
如果你打算写一个类型转换,那么你需要在类型周围加上圆括号(圆括号);例如
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。