Почему компилятор не жалуется на эту ошибку? - PullRequest
4 голосов
/ 23 мая 2010

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

class MyClass 
{ 
   static MyClass() 
    {  
     System.out.println("I am The First Statement here!"); 
       this();  
    } 
} 

Я ожидал следующих ошибок:

  1. конструктор не может быть статическим

  2. this не может быть в статической функции (поскольку конструктор недопустим)

  3. this здесь должно быть первое утверждение.

NetBeans не жалуется на вторую ошибку здесь.Почему?

Ответы [ 4 ]

5 голосов
/ 23 мая 2010

Когда компиляторы сталкиваются с ошибками, они пытаются избежать так называемых «вторичных ошибок» - ошибок, возникающих в результате других ошибок, путем «исправления» более ранних ошибок.

Например, компилятор помечает ошибку из-за некорректного объявления конструктора. Он может интерпретировать это как конструктор, который вы пытались сделать статическим, или как обычный статический метод, в котором отсутствует объявленный тип возвращаемого значения. Компилятор может исправить ваше объявление, либо проигнорировав ключевое слово static, и обработав его как обычный конструктор, либо он может рассматривать его как статический метод и «изобретать» возвращаемый тип, чтобы компенсировать отсутствующий тип возвращаемого значения.

Похоже, что NetBeans выбирает первый подход - исправляет ваш конструктор, чтобы он не был статичным. Когда компилятор решает игнорировать ключевое слово static, чтобы избежать вторичных ошибок, вызов this () становится действительным, поскольку компилятор видит, что он находится в обычном конструкторе, поэтому вторая ошибка не помечается. Это на самом деле желательное поведение - авторы компилятора идут на все, чтобы избежать вторичных ошибок, поскольку они скрывают «настоящие» ошибки. Как только вы исправите статический конструктор самостоятельно и удалите ключевое слово static, вызов this () будет действительным (исключая ошибку # 3.)

Подводя итог - это компилятор пытается показать вам реальные ошибки, а не все последующие проблемы, вызванные этими ошибками.

РЕДАКТИРОВАТЬ: после ошибки компилятор пытается восстановить, пропуская ввод, чтобы попытаться вернуться на правильный путь (чтобы повторно синхронизировать токенизатор и анализатор в известном состоянии). Часть, которую они пропускают, могла содержать ошибки или вызывать ошибку в том, что компилятор впоследствии правильно анализирует. Таким образом, исправление ошибок может привести к тому, что некоторые ошибки не будут сообщены. Это не имеет значения с точки зрения корректности - до тех пор, пока компилятор помечает одну ошибку (исходную, которая привела к необходимости восстановления после ошибки), этого достаточно. Обработка ошибок и отчеты об ошибках в первую очередь о удобстве использования. Компилятор был бы одинаково корректен, если бы он просто напечатал «error» при первой ошибке и оставил вас, чтобы выяснить, где находится ошибка - он просто не очень пригодится для использования.

0 голосов
/ 24 мая 2010

логически вы правы, в коде 3 ошибки. Однако компилятор компилирует код последовательным способом. Если предыдущие ошибки не исчезнут, он не будет разбираться глубже.

0 голосов
/ 23 мая 2010

Если я попробую это в IntelliJ, он выдаст мне следующие сообщения:

  • Компиляция завершена с 2 ошибками и 0 предупреждениями
  • (3, 11) статический модификатор здесь не разрешен
  • (6, 12) вызов этого должен быть первым оператором в конструкторе
0 голосов
/ 23 мая 2010

Вы, должно быть, отключили настройку компилятора по времени.Это ошибка времени компиляции.Они должны быть показаны.

Вы пробовали бежать?

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