教程:设置值
从本教程中,您将学习如何使用一种最基本但非常有用的调试器功能: 设置值。
在调试时,您可以获取变量的信息并检查它们,以了解程序为何以特定方式运行。 有时候,您会希望重现一些依赖于某个变量的错误。 要做到这一点,您需要这个变量保存一个特定的值。
在运行时不修改程序的情况下重现一些条件可能会很繁琐且费时,因此大多数情况下,您可以通过调试器直接设置变量值从中受益。
问题
让我们来看下面这个简单的程序:
import java.util.*;
class Aquarium {
private ArrayList<Fish> fish;
public static void main(String[] args) {
var aquarium = new Aquarium();
System.out.println(aquarium.getFish());
// fish has already been initialized
System.out.println(aquarium.getFish()); // line n1
}
private ArrayList<Fish> getFish() {
if (fish == null) initFish();
return fish;
}
private void initFish() {
fish = new ArrayList<>(Arrays.asList(
new Fish("Bubbles"),
new Fish("Calypso"),
new Fish("Dory")
));
}
}
class Fish {
private String name;
Fish(String name) {
this.name = name;
}
public String toString() {
return name;
}
}
在此代码中,我们有一个实例变量 fish ,该变量被打印了两次。 它采用了延迟初始化,这在我们的情况下意味着该字段在调用其 getter 方法之前不会被赋值。
考虑这样一种情况:您已经执行到 line n1 ,并且 fish 已经被初始化,但您想查看 initFish 方法? 此方法仅在 (fish == null) 计算结果为 true 时才会执行,而在 line n1 时已不再是这种情况。
对于这个简单的程序,我们可以直接重新启动会话。 然而,在更复杂的情况下,您可能会发现重新启动会话并重现导致某种状态的步骤非常不方便。 让我们学习更聪明的方法。
解决方案
根据问题描述,在
line n1暂停程序。
在
getFish()方法中设置一个断点。
在 变量 选项卡上,展开
aquarium,右键点击fish,然后选择 设置值。
请输入
null。 按下 Enter。
按 F9 以恢复调试器会话。
现在条件计算结果为 true ,我们再次进入 initFish 方法,这使我们能够看到它如何执行初始化。
汇总
此场景说明了如何在运行时修改变量以更改程序的执行流程。 虽然这个例子非常简单,您可以在更复杂的项目中应用相同的原则,这个功能将为您节省大量时间。
最后修改日期: 2025年 9月 22日