下,IDE 将打开三个调试器窗口:“局部变量”窗口、“监视”窗口和“调用栈”窗口。
“局部变量”窗口位于前端的调试器窗口
通过从“窗口”>“调试”菜单中进行选择,可以打开其他调试器窗口。如果在调试会话过程中打开了调试器窗口,该窗口将在您完成会话后自动关闭。如果在未启动调试会话的情况下打开调试器窗口,该窗口将一直保持打开状态,直到您手动关闭它。您可以通过将调试器窗口拖动到所需位置来对其进行排列。
下表列出了调试器窗口。
名称
快捷键
描述
局部变量
Alt-Shift-1
列出了当前调用中的局部变量。
监视
Alt-Shift-2
列出了选择在调试应用程序时进行监视的所有变量和表达式。
调用栈
Alt-Shift-3
列出了在当前线程执行期间执行的调用序列。
类
Alt-Shift-4
显示了由当前所调试的进程装入的所有类的分层结构。
断点
Alt-Shift-5
列出了当前项目中的断点。
会话
Alt-Shift-6
列出了当前在 IDE 中运行的调试会话。
线程
Alt-Shift-7
列出了当前会话中的线程组。
源
Alt-Shift-8
列出了项目类路径上的源目录。通过在此处取消选择类的源文件夹,可以设置是步入还是越过这些类。IDE 将自动越过 JDK 类;如果要步入这些类,请在此窗口中选择 JDK 源。
逐步执行代码
可以使用“运行”菜单中的以下命令来控制代码在调试器中的执行方式:
越过 (F8)。执行一行源代码。如果源代码行包含调用,则执行整个例程而不逐步
执行单个指令。
步入 (F7)。执行一行源代码。如果源代码行包含调用,则会刚好在执行例程的第一条语句之前停止。
步出 (Alt-Shift-F7)。执行一行
源代码。如果源代码行是某个例程的一部分,则会执行该例程的其余各行,然后将控制权返回给例程的调用者。
暂停。暂停执行应用
程序。
继续 (Ctrl-F5)。继续执行应用程序。应用程序将在下一个断点处停止。
运行至光标 (F4)。将当前会话运行到源代码编辑器中的光标位置,并暂停应用程序。
在本示例中,使用 F7 键按一次一行的方式逐步执行代码。loadNames 调用中出现 NullPointerException,因此在步入该调用时,将在“局部变量”视图中监视 names 数组的值。每个 Bean 都包含一个 null 值。可以继续逐步执行 loadNames 方法 - names Bean 始终为 null。
在调试器中步入代码
此处的
问题是,当代码行
SampleBean[] myNames=new SampleBean[fnames.length];
启动包含这些 Bean 的数组时,它不会实例化 Bean 自身。必须添加以下代码,在 loadNames 方法中实例化各个 Bean:
names=new SampleBean();
使其位于 loadNames 方法中的行 names.setLastName(lnames); 之前。
使用断点
大多数应用程序都太大,从而无法逐行进行检查。通常,在您认为会出现问题的位置设置一个断点,然后将应用程序运行到该位置。您还可以设置更为专用的断点(如仅当指定条件为 true 时停止执行的条件断点)或适用于某些线程或方法的断点。
在此节中,我们将使用上一个示例中的 ArrayFill 类,因此必须将上面添加的代码注释掉以便重现错误。
设置断点
如果仅希望设置简单的行断点,则可以单击所需行的左旁注处。在旁注中将会出现行断点图标 ()。再次单击此行断点可以将其删除。
在源代码编辑器中设置断点
对于更复杂的断点,请使用“运行”菜单中的“新建断点”(Ctrl-Shift-F8) 命令。“新建断点”对话框将使您能够选择要创建的断点类型并设置断点选项,如中断条件或断点输出到“输出”窗口的信息。
设置断点条件
仅当指定的布尔表达式为 true 时,条件断点才停止执行。如果要设置条件断点,请打开“新建断点”对话框,然后在“条件”字段中输入表达式。
例如,打开 ArrayFill.java,在 main 方法的 loadNames 方法调用中设置插入点,然后按 Ctrl-Shift-F8 组合键。在该对话框的“条件”字段中输入