Java开发工具IntelliJ IDEA教程:调试器基础

翻译|使用教程|编辑:吴园园|2020-05-28 14:36:37.007|阅读 12 次

概述:调试器是功能强大且用途广泛的工具,可在受控环境中执行程序。使用调试器,您可以查看应用程序的内部状态,查找错误,理解代码以及执行许多其他操作。

# 您正在找协同办公软件吗?点击这里站长给您推荐 #

IntelliJ IDEA是Java语言开发的集成环境,IntelliJ在业界被公认为优秀的Java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。IntelliJ IDEA 现已加入在线订购,点击此处了解价格详情>>

点击下载IntelliJ IDEA最新试用版

如果您曾经System.out.println()调试过代码,那么这篇文章是必读的。

调试器是一种特殊的工具,可用于在严格控制的环境中执行代码。它使您可以查看和分析应用程序的内部状态,并发现并修复可能隐藏在代码深处的错误。

使用调试器,您还可以更改和测试代码的行为而无需修改源代码,并且还可以执行许多其他有趣的事情。让我们迈入调试世界的第一步,看看该工具的功能。

点击查看:IntelliJ IDEA(2020)中的调试器基础视频教程

在调试模式下执行代码

为控制台应用程序启动调试器很简单。让我们使用以下示例代码进行演示:

package com.jetbrains;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
public class CoordinatesCopy {
   public static void main(String[] args) throws IOException {
       List<Point> lineCoordinates = createCoordinateList();
       outputValues(lineCoordinates);
       Point p = new Point(13, 30);
       removeValue(lineCoordinates, p);
       outputValues(lineCoordinates);
   }
 
   private static void outputValues(List<Point> lineCoordinates) {
       System.out.println("Output values...");
       for (Point p : lineCoordinates) {
           System.out.println(p);
       }
   }
 
   private static void removeValue(List<Point> lineCoordinates, Point p) {
       lineCoordinates.remove(p);
   }
 
   private static List<Point> createCoordinateList() {
       ArrayList<Point> list = new ArrayList<>();
       list.add(new Point(12, 20));
       list.add(new Point(13, 30));
       return list;
   }
}

有多种启动调试器的方法:

1、您可以单击装订线区域中的“运行”图标,然后选择“调试”选项。

2、您可以使用Alt + Enter调用类或main方法上的上下文操作,然后选择Debug操作。

3、您也可以从“运行”菜单或按Shift F9来启动它。

您可以编辑运行配置以添加虚拟机选项或将参数传递给程序。

Java开发工具IntelliJ IDEA教程:调试器基础

暂停,恢复,重新启动或停止调试器

如果您的应用程序似乎无响应,则可以暂停程序以分析代码的阻塞位置。让我们修改上一节中的main方法,如下所示:

    public static void main(String[] args) throws IOException {
        List<Point> lineCoordinates = createCoordinateList();
        outputValues(lineCoordinates);
        Point p = new Point(13, 30);
        int y = System.in.read();         // execution pauses here 
        removeValue(lineCoordinates, p);
        outputValues(lineCoordinates);
    }

在调试模式下执行您的应用程序。如果不输入值,则您的应用程序似乎无响应。此代码可能很容易理解,但并非所有代码库都这么简单。

在“调试”窗口中,单击“ 暂停程序”,然后编辑器窗口将显示您的应用程序当前正在执行或已阻止的类和方法。在此示例中,您可以看到该代码已被用户输入阻止,从而在编辑器中显示了相关的类和方法。您还可以查看调用堆栈。通过单击调用堆栈中的方法调用,可以在编辑器窗口中查看相应的类和方法。

您可以通过单击“ 恢复程序”或使用快捷键F9 来恢复程序执行。要以调试模式重新启动程序,请选择Rerun。您可以随时使用“ 停止”图标停止调试程序。

Java开发工具IntelliJ IDEA教程:调试器基础

注意,在这种情况下,我没有设置任何断点。

断点

断点将停止程序的执行,以便您可以分析代码的状态。

要在一行代码上设置断点,请在装订线区域中单击,或使用快捷键Ctrl + F8(Win / Linux)或⌘F8(macOS)。如果不想每次到达断点都停止执行,可以为断点定义一个条件。例如,让我们在方法outputValues()中在输出变量值的代码行中添加一个断点,p并定义一个条件,以y在引用变量的字段p等于时停止执行代码30。

您也可以将断点拖放到装订线中,然后将其移至另一行代码。默认情况下,单击装订线中的断点图标将其删除(您可以在“设置” |“首选项”中修改默认行为)。但是,如果您已经为断点定义了条件或其他参数,则可能更希望在单击断点时将其禁用而不是删除。您可以通过右键单击断点图标并选择“禁用”来执行此操作。勾号表示该行代码有信息,而叉号表示此断点上没有信息。

要检查断点及其条件如何工作,请执行此博客中包含的示例代码(在调试模式下)。你会看到,当字段的值这一计划将暂停y变量p是30。

断点还有更多。您可以右键单击装订线中的断点图标,然后单击“更多”。在打开的对话框中,您可以修改断点,以使其不暂停程序执行,而在到达时记录表达式。让我们记录该类的xand y字段的值,Point然后重新运行我们的代码。现在,代码执行不会在断点处停止–而是将我们定义的表达式记录到控制台。

调试窗口

当您的应用程序在断点处暂停执行时,调试窗口将显示重要信息,例如框架,线程,控制台窗口,步骤操作图标,变量窗格等:

如果错误地关闭了调试窗口,则始终可以使用快捷键Alt + 5(Win / Linux)或⌘5(macOS)重新打开它。与往常一样,有多种方法可以访问“调试窗口”。您还可以使用“在任何地方搜索”功能(快捷方式:Shift + Shift),使用“ 查找操作”(对于Win / Linux快捷方式为Ctrl + Shift + A,对于macOS为⇧A)以及通过搜索“调试”来访问它。 。

您的应用程序在调试模式下完成执行后,您还可以查看调试窗口。您不仅可以使用调试窗口在调试模式下浏览代码,还可以使用它来查看程序中的所有断点,使其静音并进一步修改它们的功能。

在继续进行用于调试应用程序的步骤操作之前,让我们了解本示例中使用的示例应用程序。

示例应用程序概述

本文章中使用的代码很简单。该方法createCoOrdinateList()创建Point该类的两个实例,并将它们添加到中ArrayList。该Point班有两个字段,x并且y,和getter和setter方法。该outputValues()方法将传递的列表项输出到控制台。下一行代码创建一个Point实例,该removeValue()方法尝试将其从lineCoordinates列表中删除。

执行此代码时,即使在将Pointwith x和yvalues 13并30添加到列表中时,您也会在输出中看到,当创建另一个具有相同值的实例以将其删除时,它不会成功。让我们调试代码。

要调试代码,您需要了解可用于遍历代码以查找错误的各种步骤操作。

步骤动作

有多种方法可以在调试模式下浏览代码。例如,您可能希望执行一行代码而不必担心所调用方法的细节。或者,当您从应用程序,库或API中调用另一个方法时,您可能更希望查看执行哪几行代码。您可以通过各种步骤操作来执行此操作。

在调试模式下启动应用程序之前,请设置一个断点。各种步骤操作是:

  • 单步执行(F8)使您可以执行一行代码,然后移至下一行。在逐步执行代码时,您将在编辑器窗口中的代码旁边看到变量的值。这些值在“调试”窗口的“变量”窗格中也可见。
  • 单步执行(F7)将带您进入同一类或应用程序中另一类中定义的方法的第一行代码。
  • 通过强制进入,您可以调试API或库中定义的方法。如果API或库的源代码不可用,则IntelliJ IDEA会为您反编译并调试它。
  • 使用Step Out,您可以逐行跳过方法中的代码,然后返回到调用方法。被调用的方法将执行,但不会单步执行其中的每一行代码。
  • 拖放框架使您可以通过拖放方法调用来移回代码执行。

让我们使用所有前面的操作来调试Coordinates类。我们将通过加强在代码中的行启动main()方法,步入removeValues()方法,和力步入remove()的方法ArrayList类和equals()检查方法怎样的值lineCoordinates列表被参考变量的值进行比较p,以便可以从列表中删除匹配的值。如果在调试时前进到一行代码,则可以使用Drop Frame从调用堆栈中删除一帧并返回到调用方法。

在示例应用程序中,我们发现“错误”是由该equals()方法比较值的方式引起的。仅当引用匹配时才返回true,如果引用的对应字段值匹配则不返回true。


让我们通过重写类中的equals()方法来修复此错误Point。

现在,让我们重新运行代码,并检查其是否按预期工作。启动应用程序并查看结果。

现在一切看起来都很好。我们设法找到一个错误并予以修复!

如果您要切换类并阅读代码,而错过了代码执行的位置,则可以单击Show Execution Point。要逐行跳过执行代码,可以前进到一行并单击Run to Cursor。

变量窗格

内联调试器非常有用,因为它在您逐步执行代码时会在编辑器中显示变量的值。但是,“变量”窗格显示了更多详细信息。

在此示例中,由于我们没有覆盖该类的toString()方法Point,因此编辑器窗口显示了类名和调试器对象ID,这似乎并没有太大帮助。调试器窗格显示变量的所有字段,包括私有字段。

单击堆栈将向我们显示与该堆栈相关的变量。

您可以右键单击变量,然后选择“ 跳转到源(F4)”以查看声明该变量的位置,以更好地理解您的代码。通过选择选项“ 跳转到类型源(Shift + F4)”,您还可以查看非基本变量的定义。

在调用堆栈中,您可能需要评估一个表达式以验证您的假设。例如,我可以评估的值this可变,或其他有效的表达式,如this两倍等于的实例Point类,或者this是.equals()到的一个实例Point的类。

您可以通过添加新的监视来创建一个变量,该变量的值可在所有调用堆栈中访问。说,System.getProperty然后使用您的操作系统的名称。

您可以创建监视以查看所有调用堆栈中某些变量的值。有多种方法可以做到这一点。您可以在编辑器中的代码上单击鼠标右键,然后选择添加到手表。在“变量”窗格中,您也可以单击变量并将其拖放到“监视”窗格中。

这些变量的值可能并非在所有调用堆栈中都可用。它实际上取决于变量的范围。

修改代码行为

您是否知道可以更改代码的行为而无需更改其源代码?这也适用于另一个API或框架定义的代码。

在此代码执行中,要比较的实例的x和y字段Point相等,并且此equals()方法将返回true。我们可以通过在变量窗格中右键单击并选择Set Value…来更改变量的值。当我们这样做时,代码的行为就会改变。使用修改后的值,该equals()方法将返回,false并且不会从中删除该值ArrayList。

====================================================

想要了解或购买IntelliJ IDEA正版授权的朋友,欢迎咨询慧都官方客服

JetBrain技术交流群现已开通,QQ搜索群号“786598704或者扫描下方二维码即可加入



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,尊重他人劳动成果

文章转载自:IntelliJ IDEA https://blog.jetbrains.com/idea/2020/05/debugger-basics-in-intellij-idea/

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关厂商
相关产品
IntelliJ IDEA

IntelliJ在业界被公认为优秀的Java开发平台之一,在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面表现突出,并支持基于Android平台的程序开发。

在线
客服
咨询
电话
400-700-1020
在线
QQ
购物车 反馈 返回
顶部
在线客服系统
live chat