2 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
首先,這是一個(gè)編譯錯(cuò)誤。如果在運(yùn)行時(shí)看到該消息,則可能是正在運(yùn)行的代碼具有編譯錯(cuò)誤。
以下是錯(cuò)誤的幾個(gè)示例:
double d = 1.9;
int i = int d; // error here
^
int j = someFunction(int[] a); // error here
^
在這兩種情況下,編譯器錯(cuò)誤消息均為error: '.class' expected。
錯(cuò)誤消息是什么意思,原因是什么?
坦率地說,編譯器在語法檢查過程中被一些毫無意義的代碼弄糊涂了。編譯器在實(shí)際期望表達(dá)式的上下文中遇到了類型(例如int或int[])。這就是說,在此.之后在語法上唯一可以接受的符號將是class。
這是該語法正確的示例。
Class<?> clazz = int; // incorrect
Class<?> clazz = int.class; // correct!
注意:應(yīng)該總是有可能弄清楚為什么編譯器的語法檢查器認(rèn)為類型應(yīng)該是表達(dá)式。但是,將其視為“編譯器已混淆”并查找引起混淆的(不可避免的!)語法錯(cuò)誤通常更簡單。對于初學(xué)者來說,語法錯(cuò)誤可能并不明顯……但是知道這是根本原因是一個(gè)好的開始。
您如何解決?
不幸的是,添加的“建議” .class幾乎總是不正確的。在本答案開頭的兩個(gè)示例中,它當(dāng)然無濟(jì)于事!
實(shí)際的修復(fù)方法取決于您將類型放在此處以達(dá)到的目的。
如果您打算編寫一個(gè)類型轉(zhuǎn)換,則需要在該類型周圍加上括號(圓括號)。例如
double d = 1.9;
int i = (int) d; // Correct: casts `1.9` to an integer
如果您只是打算按原樣分配值或傳遞參數(shù),則應(yīng)刪除類型。
int j = someFunction(a); // Correct ... assuming that the type of
// 'a' is suitable for that call.
聲明方法時(shí),需要指定形式參數(shù)的類型。但是您通常不需要為實(shí)際參數(shù)指定它。在少數(shù)情況下(為了解決過載歧義),請使用類型強(qiáng)制轉(zhuǎn)換。
更多例子
someMethod(array[]);
報(bào)告錯(cuò)誤,array[]因?yàn)樗穷愋投皇潜磉_(dá)式。更正可能是:
someMethod(array); // pass ref to the entire array
要么
someMethod(array[someExpression]); // pass a single array element
int i = someMethod(int j);
程序員已將參數(shù)聲明放入方法調(diào)用中。這里需要一個(gè)表達(dá)式,而不是一個(gè)聲明:
int i = someMethod(j);
int i = int(2.0);
程序員正在嘗試進(jìn)行類型轉(zhuǎn)換。應(yīng)該這樣寫:
int i = (int) 2.0;
int[]; letterCount = new int[26];
程序員添加了一個(gè)虛假的分號。應(yīng)該這樣寫:
int[] letterCount = new int[26];
if (someArray[] > 80) {
// ...
}
的someArray[]表示類型不是表達(dá)式。程序員可能表示類似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);
這里的錯(cuò)誤是“ then”語句周圍應(yīng)該有花括號。
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”子句不能是變量聲明。因此,解析器正在尋找一個(gè)可能是方法調(diào)用的表達(dá)式。例如,以下內(nèi)容在本地語法上是有效的:
if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50))
double.class.newInstance(); // no compilation error here
...盡管就其嘗試而言是荒謬的。當(dāng)然,然后編譯器會越過懸空else。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
我不買。這個(gè)問題是關(guān)于解決一個(gè)非常特定的編譯器錯(cuò)誤。如果我們開始嘗試解決其他錯(cuò)誤消息,則:1)Q&A失去了重點(diǎn),2)人們無論如何都找不到它……因?yàn)樵換被設(shè)計(jì)為谷歌搜索編譯錯(cuò)誤消息的人發(fā)現(xiàn)。
添加回答
舉報(bào)