IntelliJ IDEA代碼檢查

2018-10-17 14:26 更新

IntelliJ IDEA 代碼檢查基礎知識

IntelliJ IDEA 通過對代碼進行檢查來執(zhí)行代碼分析。對于 Java 和其他支持的語言,存在大量的代碼檢查。

IntelliJ IDEA 具有強大、快速和靈活的靜態(tài)代碼分析功能。它能檢測編譯器和運行時錯誤,建議在編譯之前進行更正和改進。

IntelliJ IDEA 代碼檢查不僅檢測到編譯錯誤,而且還發(fā)現(xiàn)不同的代碼效率低下。每當你遇到一些無法訪問的代碼、未使用的代碼、非本地化的字符串、未解決的方法、內(nèi)存泄漏甚至拼寫問題 - 你就會發(fā)現(xiàn)代碼檢查很有用。

IntelliJ IDEA 代碼分析是可靈活配置的。您可以啟用/禁用每個代碼檢查和改變其嚴重性,使用自定義的檢查集創(chuàng)建配置文件,在不同的范圍應用檢查, 禁止檢查特定的代碼段等等。

可以通過以下幾種方法進行分析:

  • 默認情況下,IntelliJ IDEA 分析所有打開的文件,并在編輯器中突出顯示所有檢測到的代碼問題。在編輯器的右側(cè),您可以看到整個文件(右上角的圖標)的分析狀態(tài)。當檢測到錯誤時,此圖標為: ;在警告的情況下,圖標為: ;如果一切正確,圖標就是 。
  • 或者,您可以在指定作用域的批量模式下運行代碼分析,它可以與整個項目一樣大。
  • 如有必要,可以在特定范圍內(nèi)應用單個代碼檢查。

對于大多數(shù)檢測到的代碼問題,IntelliJ IDEA 提供快速修復建議。您可以通過按 F2 Shift+F2,快速查看文件中的錯誤,從一個突出顯示的行導航到另一個。

有關(guān)更多信息和程序說明,??請參閱配置檢查嚴重性。

IntelliJ IDEA 檢查配置文件

當您檢查您的代碼時,您可以告訴 IntelliJ IDEA 要搜索哪些類型的問題并獲取報告。這樣的配置可以保留為檢查配置文件。

檢查配置文件定義了要查找的問題的類型,即哪些代碼檢查啟用/禁用的以及這些檢查的嚴重性。配置文件可在 "檢查設置" 頁中配置。

要設置當前檢查配置文件(在編輯器中用于動態(tài)代碼分析的配置文件),只需在“檢查設置”頁面中選擇它并應用更改。當你執(zhí)行代碼分析或執(zhí)行單次檢查時,您可以指定每次運行使用哪個配置文件。

檢查配置文件可用于整個 IDE 或特定項目:

  • 通過 VCS 可以為團隊成員共享和訪問項目配置文件。它們存儲在項目目錄中: <project>/.idea/inspectionProfiles。
  • IDE 配置文件僅供個人使用,并存儲在本地 USER_HOME/.<IntelliJ IDEA version>/config/inspection 目錄下的 XML 文件中 。

IntelliJ IDEA 附帶以下預定義的檢查配置文件:

  • 默認值:此本地(IDE 級別)配置文件供個人使用,適用于所有項目,并存儲在本地 USER_HOME/.<IntelliJ IDEA version>/config/inspection 目錄下的Default.xml 文件中。
  • 項目默認值:創(chuàng)建新項目時,將從模板項目的設置中復制項目默認配置文件。此配置文件被共享并適用于當前項目。 創(chuàng)建項目后,對項目默認配置文件的任何修改將被忽略到任何其他項目。 當在模板項目設置中修改項目默認配置文件的設置時,更改的配置文件將應用于所有新創(chuàng)建的項目,但現(xiàn)有項目不會受到影響,因為它們已經(jīng)具有該配置文件的副本。 項目默認配置文件存儲在 <project>/.idea/inspectionProfiles 目錄中的 Project_Default.xml 文件中。

您可以根據(jù)需要擁有盡可能多的檢查配置文件。創(chuàng)建新配置文件有兩種方法:您可以添加一個新的配置文件作為項目默認配置文件的副本,或復制當前選擇的配置文件。新創(chuàng)建的配置文件存儲在 XML 文件中,其位置取決于基本配置文件的類型。

只要完成并應用了對配置文件的某些更改,就會出現(xiàn)表示檢查配置文件的 <profile_name>. xml 文件。這些文件僅存儲與默認配置文件的差異。

如果是基于文件的項目格式,則共享配置文件將存儲在項目文件 <project name>.ipr 中。

有關(guān)詳細信息,請參閱自定義配置文件一節(jié)。

在計算機之間同步配置文件

如果檢查配置文件是特定于項目的,則會自動與您的項目同步。每個用戶在檢查完后打開此項目時,將啟用相同的檢查配置文件。

如果使用 IDE 默認檢查配置文件,則可以通過設置 Repository 插件在多臺計算機之間進行同步 ,并與 IntelliJ IDEA 捆綁在一起。這樣做,文件存儲在 USER_HOME/.<IntelliJ IDEA version>/config/inspection/<profile_name>.xml。

請注意,全局配置文件可能具有不同的名稱。將您當前的項目配置文件復制到全局級別(單擊 "管理" 按鈕并選擇 "復制為全局"),并按您的需要調(diào)用它。

然后,在主菜單上選擇:文件|其他設置| 默認設置, 并選擇此全局配置文件作為所有新項目的默認設置?,F(xiàn)在,所有新創(chuàng)建的項目將默認使用此全局配置文件,并且此全局配置文件將通過設置 Repository 插件在不同的計算機之間進行同步。

IntelliJ IDEA 檢查代碼嚴重性

檢查嚴重性表示檢查檢測到的代碼問題對項目的影響程度如何,并確定在編輯器中如何突出顯示檢測到的問題。默認情況下,每個檢查都具有以下嚴重性級別之一:

  • 服務器問題
  • 錯字
  • 信息
  • 弱警告
  • 警告
  • 錯誤

您可以增加或減少每次檢查的嚴重性級別。也就是說,您可以強制 IntelliJ IDEA 將某些警告顯示為錯誤或弱警告。類似的方式,最初被認為是一個弱警告可以顯示為警告或錯誤,或只是作為信息。

您還可以配置用于突出顯示每個嚴重性級別的顏色和字體樣式。此外,您可以創(chuàng)建自定義嚴重性級別并將其設置為特定檢查。

如有必要,您可以在不同范圍內(nèi)為同一檢查設置不同的嚴重性級別。

所有對上述檢查的修改都保存在當前在檢查設置中選定的檢查配置文件中,并在使用此配置文件時應用。

IntelliJ IDEA 檢驗代碼范圍

默認情況下,所有啟用的代碼檢查都適用于所有項目文件。如有必要,您可以針對不同的作用域分別配置每個代碼檢查(啟用/禁用、更改其嚴重性級別和選項)。這樣的配置,與任何其他檢查設置一樣,將作為特定配置文件的一部分保存和應用。

當檢查具有與不同范圍相關(guān)聯(lián)的不同配置時,可能會出現(xiàn)復雜的情況。當此類檢查在屬于部分或全部這些作用域的文件中執(zhí)行時,將應用最高優(yōu)先級范圍特定配置的設置。優(yōu)先級由檢查的范圍特定配置在檢查設置中的相對位置定義:最高配置具有最高優(yōu)先級。所有其他配置始終具有最低優(yōu)先級。

有關(guān)更多信息和程序說明,??請參閱配置不同范圍的檢查。

IntelliJ IDEA 代碼檢查示例

在“檢查頁面”中,所有檢查都分為幾類。代碼分析涵蓋的最常見任務包括:

  • 查找可能的錯誤。
  • 查找死代碼。
  • 檢測性能問題。
  • 改進代碼結(jié)構(gòu)和可維護性。
  • 符合編碼準則和標準。
  • 符合規(guī)格要求。

查找可能的錯誤

IntelliJ IDEA 分析您正在鍵入的代碼,并且能夠?qū)崟r發(fā)現(xiàn)可能的錯誤作為非編譯錯誤。以下是這種情況的例子。

例如,潛在的 NPE 可以在運行時拋出:

查找錯誤之前 查找錯誤之后
IntelliJ IDEA代碼可能存在的錯誤
這里是第一個if 條件可能導致在第二個 if 條件中拋出一個NullPointer 異常,如果不是所有的情況都被覆蓋。此時添加一個斷言(assertion )以避免在應用程序運行時拋出NullPointer 將是一個好主意。
IntelliJ IDEA代碼可能存在的錯誤
所以,這正是我們從意圖行動中得到的。

查找死碼

IntelliJ IDEA 在編輯中突出顯示所謂的死碼(dead code),這是在應用程序運行期間從不執(zhí)行的代碼。也許,你甚至不需要你的項目的這部分代碼。根據(jù)情況,此類代碼可能會被視為錯誤或冗余。無論如何,它降低了應用程序的性能并使維護過程復雜化。以下是一個例子。

所謂的恒定條件,例如,從未見過或永遠是真實的情況。在這種情況下,負責的代碼是不可訪問的,實際上是一個死代碼。

IntelliJ IDEA查找死代碼

IntelliJ IDEA 突出顯示 if 條件,因為它始終是真實的。所以包含 else 的代碼實際上是一個死代碼,因為它永遠不會被執(zhí)行。

突出顯示未使用的聲明

IntelliJ IDEA 還能夠立即突出顯示 Java 類、方法和字段,這些都是通過未使用的聲明檢查在整個項目中未使用的。在未使用的聲明檢查中配置的各種 Java EE @Inject 注釋、測試代碼入口點和其他隱式依賴項都受到了很深的尊重。

未解決的 JavaScript 函數(shù)或方法

此檢查檢測對未定義的 JavaScript 函數(shù)或方法的引用。


IntelliJ IDEA 未解決的 JavaScript 函數(shù)或方法

PHP 代碼檢查示例

  • 未解決的包含
    此檢查檢測到嘗試不包括實際存在的文件,并建議兩個快速修復:創(chuàng)建具有指定名稱的文件或使用 PHPDOC 注釋。
    IntelliJ IDEA PHP代碼檢查示例
  • 動態(tài)方法被稱為靜態(tài)方法
    此檢查檢測靜態(tài)函數(shù)的調(diào)用是否實際應用于靜態(tài)函數(shù)。
    IntelliJ IDEA代碼檢查示例 
    該 do_something() 函數(shù)被稱為靜態(tài)的,而實際上它是動態(tài)的。
  • 類中未實現(xiàn)的抽象方法
    此檢查檢查從抽象超類繼承的類是顯式聲明為抽象的,還是實現(xiàn)了從超類繼承的函數(shù)。
    IntelliJ IDEA代碼檢查示例:類中未實現(xiàn)的抽象方法 
    該類 ConcreteClass 繼承自抽象類 AbstractClass,并沒有被明確聲明為抽象。同時從 AbstractClass 繼承的函數(shù) GetValue () 尚未實現(xiàn)。
  • 參數(shù)類型
    PHP 變量沒有類型,因此在函數(shù)定義中基本沒有指定參數(shù)類型。但是,如果明確定義了一個參數(shù)的類型,則該函數(shù)應該使用適當類型的參數(shù)來調(diào)用。
    IntelliJ IDEA 代碼檢查示例:參數(shù)類型 
    函數(shù) do_something 具有整數(shù)(integer)類型的參數(shù), 但使用字符串(string)調(diào)用。
  • 未定義的類常量
    此檢查檢測對指定類中未實際定義的常量的引用。
    IntelliJ IDEA 代碼檢查示例:未定義的類常量 
    常量 NotExistingConst 被引用為 Animal 類的常量,而實際上它不在此類中定義。
  • 未定義常數(shù)檢查
    此檢查檢測對在檢測范圍內(nèi)任何地方實際未定義的常數(shù)的引用。
    IntelliJ IDEA 代碼檢查示例 
    引用的常數(shù) UndefinedConst 在檢查范圍內(nèi)的任何地方都沒有定義。
  • 未定義的類
    此檢查檢測對在檢查范圍內(nèi)任何地方實際未定義的類的引用。
    IntelliJ IDEA 代碼檢查示例
    引用的類 NotExistingClass 沒有定義。
  • 未定義字段
    此檢查檢測對類中未實際定義的類的字段的引用。
    IntelliJ IDEA 代碼檢查示例 

    該 $obj 變量是類 Animal 的一個實例。$var 的聲明包含對類 Animal 的字段的引用,類 Animal 不在此類上定義。
    若要在這種情況下禁止報告未定義的方法錯誤,請重新配置檢查嚴重性。要這樣做,請打開 "設置" 對話框的 "檢查" 頁,單擊列表中的檢查名稱,并在 "選項" 區(qū)域中的 "類中存在 __magic 方法" 復選框中選擇降級嚴重性。在這種情況下,這些未定義的屬性將被指示為一般的檢查低于規(guī)定的一個步驟,默認情況下,是信息而不是警告。
    若要抑制不相關(guān)的未定義字段錯誤報告,請清除 "通過 magic 方法訪問字段的通知",并通知 PHP 動態(tài)字段聲明復選框。當選中復選框時,IntelliJ IDEA 報告錯誤,即使該類包含 __get() 和__set() magic 方法。 
  • 調(diào)用未定義的函數(shù)
    此檢查檢測對未在檢查范圍內(nèi)任何位置定義的函數(shù)的引用。
    IntelliJ IDEA 代碼檢查示例 
    在檢查范圍內(nèi)的任何位置都沒有定義被調(diào)用函數(shù) undefined_function ()
  • 未定義的變量
    此檢查檢測對未在檢查范圍內(nèi)的任何位置聲明和初始化的變量的引用。PHP 不需要聲明和初始化每個變量。PHP 可以即時初始化這個變量,并將其分配給零值。但是,此檢查允許您檢測到這種差異。
    可以通過 "設置" 對話框的 "檢查" 頁上的復選框來配置未定義的變量檢查:
    • 在全局空間中啟用檢查:選中此復選框可以針對函數(shù)/方法、類和命名空間之外的變量 (即在全局空間中) 運行檢查。
      IntelliJ IDEA 代碼檢查示例
    • 該報告變量可能尚未定義:選中此復選框可以顯示警告,即使變量的定義不是絕對缺失。當變量在多個路徑中使用時,可能會發(fā)生這種情況,其中一些變量可能永遠無法達到,例如在 if() 語句中:
      IntelliJ IDEA 代碼檢查示例
    • 忽略 'include' 和 'require' 語句,假設檢查范圍包含一個 include 或多個 require 語句。如果此復選框被清除,IntelliJ IDEA 將處理通過這些語句引用的類中定義的變量,并且不會報告任何錯誤。如果選中此復選框,則報告未定義的變量錯誤。
      IntelliJ IDEA 代碼檢查示例
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號