Что означает «ошибка: .class« ожидается »и как я могу это исправить - PullRequest
0 голосов
/ 17 декабря 2018

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

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

Некоторые компиляторы Java IDE утверждают это несколько иначе;e, g,

error: insert ". class" to complete Expression 

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

1 Ответ

0 голосов
/ 17 декабря 2018

Прежде всего, это ошибка компиляции.Если вы видите сообщение в 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); 

Программист поместил объявление параметра в метод call .Здесь требуется выражение, а не объявление:

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.


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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...