Что означает "error: '.class' expected" и как ее исправить

Иногда новые пользователи сталкиваются со следующей довольно непонятной ошибкой компиляции '.class' expected:

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

Некоторые компиляторы Java IDE заявляют об этом несколько иначе; например,

error: insert ". class" to complete Expression 

Что делают ошибки, подобные этой на самом деле означает, что их вызывает и как их исправить?

Насколько мне известноЭта ошибка чаще всего возникает из-за опечаток.
aakash 17.12.2018 07:36

Я не согласен. Когда новичок совершает эту ошибку, обычно это связано с тем, что у него есть неправильно понятый что-то о синтаксисе Java.

Stephen C 17.12.2018 07:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
15 269
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, это ошибка компиляции. Если вы видите сообщение время выполнения, вероятно, вы выполняете код с ошибками компиляции.

Вот пара примеров ошибки:

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.

Уважаемый читатель! Если вы встретите другие примеры, относящиеся к существенно отличается, к приведенным выше, пожалуйста, добавьте комментарий (со ссылкой), чтобы я мог добавить их к этому ответу. Спасибо!!

Stephen C 05.01.2019 11:10

Другие вопросы по теме