注:开发工程中,用Debug代替Run,是个不错的习惯,可以让我们随时调试代码
准备工作 主界面介绍 各功能键详解 查看变量 更改变量值 设置断点条件 计算表达式 回退操作 强制返回 多线程调试 Stream 调试 远程Debug 最后
准备工作
IDEA 调试代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Created By L
* Description:
*/
public class ToSum {
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int sub = target - nums[i];
// 查找余数是否在表中,有则返回两个数的索引
// 没有则将其信息添加进哈希表
if (map.containsKey(sub)) {
return new int[]{map.get(sub), i};
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
public static void main(String[] args) {
int[] nums = {2, 7, 11, 15};
int target = 9;
int[] ints = twoSum(nums, target);
System.out.println(Arrays.toString(ints));
}
}
注:这里用的mac,快捷键和Windows不太一样,不过不影响大家学习技能,我用到的快捷键一定是两平台通用的,然后这里正好强迫下大家去实际操作一下,学过没用过,等于没学过。
主界面介绍
Debug: 启动Debug功能。 断点: 可在左边栏单击,以打上断点,以Debug方式运行到此时,程序会停下。 服务按钮: 可以在这里关闭服务、启动服务、修改Debug配置,设置断点等。 调试按钮: 共8个其中包括:Show Execution Point、Step Over (F8)、Step Into (F7)、Force Step Into、Step Out、Drop Frame、Run to Cursor、Evaluate Expression,后面会详细解释功能。 Frames: 显示了该线程调试所经过的所有方法,勾选右上角的漏斗(Show All Frames)按钮,就不会显示其它类库的方法了,否则这里会有一大堆的方法。 Variables: 可以查看变量具体的值,当然也可以修改。 Watches: 查看变量,可以将Variables区中的变量拖到Watches中查看,默认的Debug窗口,可能并没有这个窗口,你需要点击Variables窗口的“眼镜”👓图标,此窗口才会出现。再点击Watches列里“眼镜”👓图标,即可收回。 Debug窗口: 可以设置Debug窗口是否固定,或显示在哪个边栏,只需右键即可选择。你甚至可以拖动该Debug窗口,使其以独立窗口形式存在。
各功能键详解
Rerun ‘xxx’: 重新运行程序,点击会以Debug方式重启服务。 Edit Run Configuration:“xxx” : 更改运行时配置,其中包括运行Java版本更,环境变量等更改,还可以用于进行远程调试,之后详解。 Resume Program (F9): 恢复程序,从一个断点运行至下一个断点,没有断点则运行完整个程序。 Pause Program: 暂停程序,当我们执行某步时间太长,或遇到死循环时,可使用其暂停程序,如想继续执行,再点击Resume Program (F9)即可。 Stop ‘xxx’ (Ctrl + F2): 终止当前Debug程序。 View Breakpoints: 查看所有断点,还可选择按包、文件或class类进行断点分组,还可对断点进行一些配置,包括条件配置,多线程配置等,后面会详解。 Mute Breakpoints: 沉默所有断点,选择这个后,所有断点变为灰色,断点失效。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled,会显示空心的红圈,表示当前断点不可用。 Get Thread Dump: 导出当前堆栈信息,可用作其它分析。 Settings: 一些显示设置,可以设置是否在代码界面显示Values、Return Values等,开启即可。 Pin Tab: 是否固定当前Debug标签页。
Show Execution Point : 定位,点击此按钮可定位到当前代码执行的行。 Step Over (F8): 步过,一行一行地往下走,如果执行到子方法,子方法内又无断点的情况下,会跳过子方法继续执行。 Step Into (F7): 步入,一行一行地往下走,如果执行到子方法,无论子方法有无断点,都会进入到子方法,子方法执行完后返回,继续执行。 Force Step Into (Alt + Shift + F7): 强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。 Step Out (Shift + F8): 步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。 Drop Frame: 回退断点,相当于后悔药,后面会详解。 Run to Cursor: 使程序运行至光标处,而光标处不需要打断点,运行过程中,有断点会在断点处停止。 Evaluate Expression…: 计算表达式,后面章节详细说明。 Trace Current Stream Chain: 显示Stream处理的整体过程。Lambda调试神器,之后会详解。
new Watch…: 新增观察变量。 Remove Watch: 删除观察变量 Move Watch Up: 向上移动观察变量。 Move Watch Down: 向下移动观察变量。 Duplicate Watch: 复制观察变量。 Show watches in variables tab: Watches不会默认打开为新窗口,点击“眼镜”👓图标后,才会打开为新窗口,再次点击会回到Variables边栏。
查看变量
更改变量值
设置断点条件
计算表达式
Evaluate Expression…
按键即可。比如,我想知道此时map.keySet()
的值会是多少,直接点击Evaluate即可。回退操作
强制返回
Force Return
强制返回即可。int[]
,我们直接new int[]{2, 7}
返回即可,当然我们也可以返回点让前端开心点的数据,哄哄前端。多线程调试
Stream 调试
Trace Current Stream Chain
按钮常年都是黑色的,为什么呢,因为他是做Stream调试的,只有断点在Stream表达式时才能使用,使用方法即断点在Stream时,点击该按钮即可。远程Debug
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=xxx
参数,其中xxx为监听端口,详细步骤如下:Edit Configuration…
Remote JVM Debug
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar
最后
往期历史