Иногда новые пользователи сталкиваются со следующей довольно непонятной ошибкой компиляции '.class' expected:
double d = 1.9;
int i = int d; // error here
^
error: '.class' expected
Некоторые компиляторы Java IDE заявляют об этом несколько иначе; например,
error: insert ". class" to complete Expression
Что делают ошибки, подобные этой на самом деле означает, что их вызывает и как их исправить?
Я не согласен. Когда новичок совершает эту ошибку, обычно это связано с тем, что у него есть неправильно понятый что-то о синтаксисе Java.




Прежде всего, это ошибка компиляции. Если вы видите сообщение время выполнения, вероятно, вы выполняете код с ошибками компиляции.
Вот пара примеров ошибки:
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);
}
Но замешательство компилятора состоит в том, что предложение then в if не может быть объявлением переменной. Итак, синтаксический анализатор ищет выражение, которое могло бы быть вызовом метода. Например, локально синтаксически допустимым будет следующее:
if ((withdraw % 5 == 0) && (acnt_balc >= withdraw + 0.50))
double.class.newInstance(); // no compilation error here
... хотя и бессмысленный с точки зрения того, что он пытается делать. И, конечно же, компилятор может споткнуться о болтающийся else.
Уважаемый читатель! Если вы встретите другие примеры, относящиеся к существенно отличается, к приведенным выше, пожалуйста, добавьте комментарий (со ссылкой), чтобы я мог добавить их к этому ответу. Спасибо!!