IntelliJ IDEA代码检查

2018-10-17 14:26 更新

IntelliJ IDEA 代码检查基础知识

IntelliJ IDEA 通过对代码进行检查来执行代码分析。对于 Java 和其他支持的语言,存在大量的代码检查。

IntelliJ IDEA 具有强大、快速和灵活的静态代码分析功能。它能检测编译器和运行时错误,建议在编译之前进行更正和改进。

IntelliJ IDEA 代码检查不仅检测到编译错误,而且还发现不同的代码效率低下。每当你遇到一些无法访问的代码、未使用的代码、非本地化的字符串、未解决的方法、内存泄漏甚至拼写问题 - 你就会发现代码检查很有用。

IntelliJ IDEA 代码分析是可灵活配置的。您可以启用/禁用每个代码检查和改变其严重性,使用自定义的检查集创建配置文件,在不同的范围应用检查, 禁止检查特定的代码段等等。

可以通过以下几种方法进行分析:

  • 默认情况下,IntelliJ IDEA 分析所有打开的文件,并在编辑器中突出显示所有检测到的代码问题。在编辑器的右侧,您可以看到整个文件(右上角的图标)的分析状态。当检测到错误时,此图标为: ;在警告的情况下,图标为: ;如果一切正确,图标就是
  • 或者,您可以在指定作用域的批量模式下运行代码分析,它可以与整个项目一样大。
  • 如有必要,可以在特定范围内应用单个代码检查。

对于大多数检测到的代码问题,IntelliJ IDEA 提供快速修复建议。您可以通过按 F2 Shift+F2,快速查看文件中的错误,从一个突出显示的行导航到另一个。

有关更多信息和程序说明,​​请参阅配置检查严重性。

IntelliJ IDEA 检查配置文件

当您检查您的代码时,您可以告诉 IntelliJ IDEA 要搜索哪些类型的问题并获取报告。这样的配置可以保留为检查配置文件。

检查配置文件定义了要查找的问题的类型,即哪些代码检查启用/禁用的以及这些检查的严重性。配置文件可在 "检查设置" 页中配置。

要设置当前检查配置文件(在编辑器中用于动态代码分析的配置文件),只需在“检查设置”页面中选择它并应用更改。当你执行代码分析或执行单次检查时,您可以指定每次运行使用哪个配置文件。

检查配置文件可用于整个 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 文件中。
  • 项目默认值:创建新项目时,将从模板项目的设置中复制项目默认配置文件。此配置文件被共享并适用于当前项目。 创建项目后,对项目默认配置文件的任何修改将被忽略到任何其他项目。 当在模板项目设置中修改项目默认配置文件的设置时,更改的配置文件将应用于所有新创建的项目,但现有项目不会受到影响,因为它们已经具有该配置文件的副本。 项目默认配置文件存储在 <project>/.idea/inspectionProfiles 目录中的 Project_Default.xml 文件中。

您可以根据需要拥有尽可能多的检查配置文件。创建新配置文件有两种方法:您可以添加一个新的配置文件作为项目默认配置文件的副本,或复制当前选择的配置文件。新创建的配置文件存储在 XML 文件中,其位置取决于基本配置文件的类型。

只要完成并应用了对配置文件的某些更改,就会出现表示检查配置文件的 <profile_name>. xml 文件。这些文件仅存储与默认配置文件的差异。

如果是基于文件的项目格式,则共享配置文件将存储在项目文件 <project name>.ipr 中。

有关详细信息,请参阅自定义配置文件一节。

在计算机之间同步配置文件

如果检查配置文件是特定于项目的,则会自动与您的项目同步。每个用户在检查完后打开此项目时,将启用相同的检查配置文件。

如果使用 IDE 默认检查配置文件,则可以通过设置 Repository 插件在多台计算机之间进行同步 ,并与 IntelliJ IDEA 捆绑在一起。这样做,文件存储在 USER_HOME/.<IntelliJ IDEA version>/config/inspection/<profile_name>.xml。

请注意,全局配置文件可能具有不同的名称。将您当前的项目配置文件复制到全局级别(单击 "管理" 按钮并选择 "复制为全局"),并按您的需要调用它。

然后,在主菜单上选择:文件|其他设置| 默认设置, 并选择此全局配置文件作为所有新项目的默认设置。现在,所有新创建的项目将默认使用此全局配置文件,并且此全局配置文件将通过设置 Repository 插件在不同的计算机之间进行同步。

IntelliJ IDEA 检查代码严重性

检查严重性表示检查检测到的代码问题对项目的影响程度如何,并确定在编辑器中如何突出显示检测到的问题。默认情况下,每个检查都具有以下严重性级别之一:

  • 服务器问题
  • 错字
  • 信息
  • 弱警告
  • 警告
  • 错误

您可以增加或减少每次检查的严重性级别。也就是说,您可以强制 IntelliJ IDEA 将某些警告显示为错误或弱警告。类似的方式,最初被认为是一个弱警告可以显示为警告或错误,或只是作为信息。

您还可以配置用于突出显示每个严重性级别的颜色和字体样式。此外,您可以创建自定义严重性级别并将其设置为特定检查。

如有必要,您可以在不同范围内为同一检查设置不同的严重性级别。

所有对上述检查的修改都保存在当前在检查设置中选定的检查配置文件中,并在使用此配置文件时应用。

IntelliJ IDEA 检验代码范围

默认情况下,所有启用的代码检查都适用于所有项目文件。如有必要,您可以针对不同的作用域分别配置每个代码检查(启用/禁用、更改其严重性级别和选项)。这样的配置,与任何其他检查设置一样,将作为特定配置文件的一部分保存和应用。

当检查具有与不同范围相关联的不同配置时,可能会出现复杂的情况。当此类检查在属于部分或全部这些作用域的文件中执行时,将应用最高优先级范围特定配置的设置。优先级由检查的范围特定配置在检查设置中的相对位置定义:最高配置具有最高优先级。所有其他配置始终具有最低优先级。

有关更多信息和程序说明,​​请参阅配置不同范围的检查。

IntelliJ IDEA 代码检查示例

在“检查页面”中,所有检查都分为几类。代码分析涵盖的最常见任务包括:

  • 查找可能的错误。
  • 查找死代码。
  • 检测性能问题。
  • 改进代码结构和可维护性。
  • 符合编码准则和标准。
  • 符合规格要求。

查找可能的错误

IntelliJ IDEA 分析您正在键入的代码,并且能够实时发现可能的错误作为非编译错误。以下是这种情况的例子。

例如,潜在的 NPE 可以在运行时抛出:

查找错误之前 查找错误之后
IntelliJ IDEA代码可能存在的错误
这里是第一个if 条件可能导致在第二个 if 条件中抛出一个NullPointer 异常,如果不是所有的情况都被覆盖。此时添加一个断言(assertion )以避免在应用程序运行时抛出NullPointer 将是一个好主意。
IntelliJ IDEA代码可能存在的错误
所以,这正是我们从意图行动中得到的。

查找死码

IntelliJ IDEA 在编辑中突出显示所谓的死码(dead code),这是在应用程序运行期间从不执行的代码。也许,你甚至不需要你的项目的这部分代码。根据情况,此类代码可能会被视为错误或冗余。无论如何,它降低了应用程序的性能并使维护过程复杂化。以下是一个例子。

所谓的恒定条件,例如,从未见过或永远是真实的情况。在这种情况下,负责的代码是不可访问的,实际上是一个死代码。

IntelliJ IDEA查找死代码

IntelliJ IDEA 突出显示 if 条件,因为它始终是真实的。所以包含 else 的代码实际上是一个死代码,因为它永远不会被执行。

突出显示未使用的声明

IntelliJ IDEA 还能够立即突出显示 Java 类、方法和字段,这些都是通过未使用的声明检查在整个项目中未使用的。在未使用的声明检查中配置的各种 Java EE @Inject 注释、测试代码入口点和其他隐式依赖项都受到了很深的尊重。

未解决的 JavaScript 函数或方法

此检查检测对未定义的 JavaScript 函数或方法的引用。


IntelliJ IDEA 未解决的 JavaScript 函数或方法

PHP 代码检查示例

  • 未解决的包含
    此检查检测到尝试不包括实际存在的文件,并建议两个快速修复:创建具有指定名称的文件或使用 PHPDOC 注释。
    IntelliJ IDEA PHP代码检查示例
  • 动态方法被称为静态方法
    此检查检测静态函数的调用是否实际应用于静态函数。
    IntelliJ IDEA代码检查示例 
    该 do_something() 函数被称为静态的,而实际上它是动态的。
  • 类中未实现的抽象方法
    此检查检查从抽象超类继承的类是显式声明为抽象的,还是实现了从超类继承的函数。
    IntelliJ IDEA代码检查示例:类中未实现的抽象方法 
    该类 ConcreteClass 继承自抽象类 AbstractClass,并没有被明确声明为抽象。同时从 AbstractClass 继承的函数 GetValue () 尚未实现。
  • 参数类型
    PHP 变量没有类型,因此在函数定义中基本没有指定参数类型。但是,如果明确定义了一个参数的类型,则该函数应该使用适当类型的参数来调用。
    IntelliJ IDEA 代码检查示例:参数类型 
    函数 do_something 具有整数(integer)类型的参数, 但使用字符串(string)调用。
  • 未定义的类常量
    此检查检测对指定类中未实际定义的常量的引用。
    IntelliJ IDEA 代码检查示例:未定义的类常量 
    常量 NotExistingConst 被引用为 Animal 类的常量,而实际上它不在此类中定义。
  • 未定义常数检查
    此检查检测对在检测范围内任何地方实际未定义的常数的引用。
    IntelliJ IDEA 代码检查示例 
    引用的常数 UndefinedConst 在检查范围内的任何地方都没有定义。
  • 未定义的类
    此检查检测对在检查范围内任何地方实际未定义的类的引用。
    IntelliJ IDEA 代码检查示例
    引用的类 NotExistingClass 没有定义。
  • 未定义字段
    此检查检测对类中未实际定义的类的字段的引用。
    IntelliJ IDEA 代码检查示例 

    该 $obj 变量是类 Animal 的一个实例。$var 的声明包含对类 Animal 的字段的引用,类 Animal 不在此类上定义。
    若要在这种情况下禁止报告未定义的方法错误,请重新配置检查严重性。要这样做,请打开 "设置" 对话框的 "检查" 页,单击列表中的检查名称,并在 "选项" 区域中的 "类中存在 __magic 方法" 复选框中选择降级严重性。在这种情况下,这些未定义的属性将被指示为一般的检查低于规定的一个步骤,默认情况下,是信息而不是警告。
    若要抑制不相关的未定义字段错误报告,请清除 "通过 magic 方法访问字段的通知",并通知 PHP 动态字段声明复选框。当选中复选框时,IntelliJ IDEA 报告错误,即使该类包含 __get() 和__set() magic 方法。 
  • 调用未定义的函数
    此检查检测对未在检查范围内任何位置定义的函数的引用。
    IntelliJ IDEA 代码检查示例 
    在检查范围内的任何位置都没有定义被调用函数 undefined_function ()
  • 未定义的变量
    此检查检测对未在检查范围内的任何位置声明和初始化的变量的引用。PHP 不需要声明和初始化每个变量。PHP 可以即时初始化这个变量,并将其分配给零值。但是,此检查允许您检测到这种差异。
    可以通过 "设置" 对话框的 "检查" 页上的复选框来配置未定义的变量检查:
    • 在全局空间中启用检查:选中此复选框可以针对函数/方法、类和命名空间之外的变量 (即在全局空间中) 运行检查。
      IntelliJ IDEA 代码检查示例
    • 该报告变量可能尚未定义:选中此复选框可以显示警告,即使变量的定义不是绝对缺失。当变量在多个路径中使用时,可能会发生这种情况,其中一些变量可能永远无法达到,例如在 if() 语句中:
      IntelliJ IDEA 代码检查示例
    • 忽略 'include' 和 'require' 语句,假设检查范围包含一个 include 或多个 require 语句。如果此复选框被清除,IntelliJ IDEA 将处理通过这些语句引用的类中定义的变量,并且不会报告任何错误。如果选中此复选框,则报告未定义的变量错误。
      IntelliJ IDEA 代码检查示例
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号