分析数据流
最后修改时间:2023 年 8 月 24 日在使用大型代码库时,有时很难弄清楚如何处理数据以及如何改进工作流程以使代码更具性能和可读性。为了实现这一点,IntelliJ IDEA 数据流分析使您能够在不运行程序的情况下跟踪所有可能的数据转换。这些信息可用于改进应用程序的设计并在错误出现之前对其进行诊断。
笔记
本主题中介绍的功能仅适用于 Java。
数据流分析提供以下信息:
方法或表达式下游的数据会发生什么:消费者是什么以及可以产生什么可能的值。
方法可以具有的所有可能的输入值以及特定值的来源。
变量是否可能是
null
. 使用此信息,您可以防止意外的 NullPointerExceptions 并通过删除冗余的空检查和注释来优化您的工作流程@Nullable
。
查看分析结果
将插入符号放在代表您要分析的数据的标识符处。您可以选择分析声明、语句、方法参数等处的符号。
从主菜单中选择代码 | 分析代码 | 数据流向这里分析上游数据(生产者)或代码| 分析代码 | 数据从这里流向下游(消费者)分析数据。
指定分析的范围。如果要排除测试,请清除包括测试源复选框。
此外,如果您对特定值或表达式结果感兴趣,您可以在“过滤器”字段中指定它,以仅显示相关结果(可在此处的数据流中找到)。
过滤器示例
空/非空值
null
!null
细绳
"Hello"
枚举
SPRING
SUMMER
FALL
WINTER
布尔值
true
false
整型/长整型
0
>0
<=100
!=9
将打开一个包含分析结果的工具窗口。它们按节点组织,每个节点代表一个数据流步骤。
在示例中:
该
getComplete()
方法返回变量的值complete
。该
complete
变量可以在初始化期间赋值null
或在setComplete
方法中获取任何值。该
setComplete()
方法在第 17 行和第 48 行调用,并分别为false
和赋值true
。
提示
双击某个条目即可转到代码中相应的片段。此外,您可以通过单击(“单击导航”按钮)或在单独的选项卡中预览代码(“预览用法”按钮)来完成此操作。
刷新结果
如果代码已更改,并且您想要再次分析相同的表达式,请单击“分析”工具窗口中的“刷新”。
分析可能的值
查看数据流向此处时,您可以按值对节点进行分组,以获取可能值的摘要或分析其来源。
要获取有关特定值的信息,请单击“分析”工具窗口左侧的“按叶表达式分组”。
要获取有关空值/非空值的信息,请单击“分析”工具窗口左侧的“按叶表达式空值分组”。
导出到文件
如果您想以文本格式共享分析结果,请使用“导出”选项。
选择要导出的分析选项卡。
单击分析工具窗口左侧的导出到文本文件 。
如果要将结果复制到剪贴板,请单击复制。要将结果导出到文件,请在导出到文件字段中选择文件,然后单击保存。
分析堆栈跟踪
当您的程序因异常而崩溃时,您可以使用堆栈跟踪作为数据流分析的输入。这可以帮助您跟踪不适当的值可能来自何处。
public class ArrayTest {
static int[] ints = new int[5];
public static void main(String[] args) {
ArrayTest arrayTest = new ArrayTest();
int a = arrayTest.getRandomElement(ints);
System.out.println(a);
}
private int getRandomElement(int[] array) {
int index = new java.util.Random().nextInt(20);
return array[index];
}
}
上面的代码创建一个固定大小的数组并尝试从中访问随机元素。有时它会抛出一个错误ArrayOutOfBoundsException
,因为索引可能大于数组的长度。
在堆栈跟踪中,单击引发异常的帧的源引用。
编辑器会将您带到源代码中的相应行。
单击弹出窗口以查找导致异常的值的来源。
此处的数据流将打开并应用过滤器。
感谢您的反馈意见!