簡體   English   中英

為什么編譯器不抱怨這個錯誤?

[英]Why doesn't the compiler complain about this error?

我正在寫一些Java問題來幫助我的朋友參加Java考試。 我寫了一個問題,我假設代碼中會出現三個錯誤,但編譯器只抱怨兩個。 代碼是:

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

我預計會出現以下錯誤:

  1. 構造函數不能是靜態的

  2. this不能在靜態函數中(因為構造函數無效)

  3. this應該是第一個聲明。

NetBeans沒有抱怨這里的第二個錯誤。 為什么?

當編譯器遇到錯誤時,他們會嘗試通過“修復”早期錯誤來避免所謂的“二次錯誤” - 由其他錯誤導致的錯誤。

例如,由於構造函數聲明格式錯誤,編譯器會標記錯誤。 它可以將其解釋為構造函數,您嘗試創建靜態函數,或者作為缺少聲明的返回類型的常規靜態方法。 編譯器可以通過忽略static關鍵字並將其視為常規構造函數來修復您的聲明,或者它可以將其視為靜態方法並“發明”返回類型以彌補缺少的返回類型。

聽起來NetBeans正在采用第一種方法 - 修復構造函數,使其不是靜態的。 當編譯器選擇忽略static關鍵字時,為了避免二次錯誤,this()調用是有效的,因為編譯器發現它在常規構造函數中,因此第二個錯誤沒有被標記。 這實際上是理想的行為 - 編譯器編寫者竭盡全力避免二次錯誤,因為它們會掩蓋“真正的”錯誤。 一旦你自己修復靜態構造函數並刪除static關鍵字,this()調用就會有效(除非錯誤#3。)

總結一下 - 編譯器試圖向您展示真正的錯誤,而不是由這些錯誤引起的所有后續問題。

編輯:發生錯誤后,編譯器嘗試通過跳過輸入來嘗試恢復正常(將標記生成器和解析器重新同步到已知狀態)。 他們跳過的部分可能包含錯誤,或者導致編譯器隨后正確解析的錯誤。 因此,錯誤恢復可能導致一些錯誤未被報告。 從正確性的角度來看,這並不重要 - 只要編譯器標記一個錯誤(導致需要錯誤恢復的原始錯誤)就足夠了。 錯誤處理和錯誤報告主要是關於可用性。 如果編譯器只是在第一個錯誤處打印“錯誤”並讓你弄清楚錯誤的位置 - 它就不會非常有用,那么編譯器也同樣正確。

如果我在IntelliJ中嘗試這個,它會給我這些消息:

  • 編譯完成時有2個錯誤和0個警告
  • (3,11)修飾符靜態不允許在這里
  • (6,12)調用這必須是構造函數中的第一個語句

從邏輯上講,你是對的,代碼中有3個錯誤。 但是,編譯器以順序方式編譯代碼。 除非先前的錯誤消失,否則不會進行更深入的解析。

您必須已禁用及時編譯器設置。 這些是編譯時錯誤。 必須展示它們。

你試過跑嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM