IntelliJ IDEA代碼檢查

2018-10-17 14:26 更新

IntelliJ IDEA 代碼檢查基礎(chǔ)知識(shí)

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

IntelliJ IDEA 具有強(qiáng)大、快速和靈活的靜態(tài)代碼分析功能。它能檢測(cè)編譯器和運(yùn)行時(shí)錯(cuò)誤,建議在編譯之前進(jìn)行更正和改進(jìn)。

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

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

可以通過以下幾種方法進(jìn)行分析:

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

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

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

IntelliJ IDEA 檢查配置文件

當(dāng)您檢查您的代碼時(shí),您可以告訴 IntelliJ IDEA 要搜索哪些類型的問題并獲取報(bào)告。這樣的配置可以保留為檢查配置文件。

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

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

檢查配置文件可用于整個(gè) IDE 或特定項(xiàng)目:

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

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

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

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

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

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

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

在計(jì)算機(jī)之間同步配置文件

如果檢查配置文件是特定于項(xiàng)目的,則會(huì)自動(dòng)與您的項(xiàng)目同步。每個(gè)用戶在檢查完后打開此項(xiàng)目時(shí),將啟用相同的檢查配置文件。

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

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

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

IntelliJ IDEA 檢查代碼嚴(yán)重性

檢查嚴(yán)重性表示檢查檢測(cè)到的代碼問題對(duì)項(xiàng)目的影響程度如何,并確定在編輯器中如何突出顯示檢測(cè)到的問題。默認(rèn)情況下,每個(gè)檢查都具有以下嚴(yán)重性級(jí)別之一:

  • 服務(wù)器問題
  • 錯(cuò)字
  • 信息
  • 弱警告
  • 警告
  • 錯(cuò)誤

您可以增加或減少每次檢查的嚴(yán)重性級(jí)別。也就是說,您可以強(qiáng)制 IntelliJ IDEA 將某些警告顯示為錯(cuò)誤或弱警告。類似的方式,最初被認(rèn)為是一個(gè)弱警告可以顯示為警告或錯(cuò)誤,或只是作為信息。

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

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

所有對(duì)上述檢查的修改都保存在當(dāng)前在檢查設(shè)置中選定的檢查配置文件中,并在使用此配置文件時(shí)應(yīng)用。

IntelliJ IDEA 檢驗(yàn)代碼范圍

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

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

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

IntelliJ IDEA 代碼檢查示例

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

  • 查找可能的錯(cuò)誤。
  • 查找死代碼。
  • 檢測(cè)性能問題。
  • 改進(jìn)代碼結(jié)構(gòu)和可維護(hù)性。
  • 符合編碼準(zhǔn)則和標(biāo)準(zhǔn)。
  • 符合規(guī)格要求。

查找可能的錯(cuò)誤

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

例如,潛在的 NPE 可以在運(yùn)行時(shí)拋出:

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

查找死碼

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

所謂的恒定條件,例如,從未見過或永遠(yuǎn)是真實(shí)的情況。在這種情況下,負(fù)責(zé)的代碼是不可訪問的,實(shí)際上是一個(gè)死代碼。

IntelliJ IDEA查找死代碼

IntelliJ IDEA 突出顯示 if 條件,因?yàn)樗冀K是真實(shí)的。所以包含 else 的代碼實(shí)際上是一個(gè)死代碼,因?yàn)樗肋h(yuǎn)不會(huì)被執(zhí)行。

突出顯示未使用的聲明

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

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

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


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

PHP 代碼檢查示例

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)