Java新手进阶(大头菜联盟)--调试程序

    调试(英文Debug),作为一项很重要的技能,培训机构基本上不怎么给讲,可能是觉得过于简单。但恰恰是这个最基础的技能,导致很多同学第一天上班就被辞退,他们的代码满篇都是使用System.out.print()的打印输出代码,程序被这些代码搞得乱七八糟,不堪入目。

    很多同学疑惑为什么不可以用System.out.print()呢,这里简单给大家讲几点原因,自己品一品是不是这样的。

1.问题排查解决后,这些打印代码应该删除,保持代码整洁。很多时候,在删除代码的时候,又改错了其他的代码,重新引入新的问题。

2.问题定位需要多次追加打印语句,每修改一次代码,就要重新运行一次程序,重新通过输入或点击进入到测试场景。这样重复性的操作多次后,会让你失去耐心,烦躁的心情更不容易分析问题。并且效率极低,每次从运行到进入测试场景,至少也要几十秒,本来清晰连贯的思路,也会被这每一次次的几十秒间隔所打断。

3.最终发布上线后,未删除的打印语句,会影响性能,尤其是在频繁使用的模块里的打印代码。如果里面包含用户名密码等敏感信息也打印出来,会造成信息安全事故。


调试,我们都用在什么地方呢?

大体包括:结果不是预想的,压根没出来结果,确认某些逻辑代码是否运行了,动态修改运行参数。

我们将以Eclipse为例,来介绍开发过程中与我们息息相关的Debug功能。我们先来说几个名词:

断点(BreakPoint):调试的过程就是把程序以u行为单位,逐行或多行运行。断点就是用来控制程序停在哪里的。

单步执行(Step Over):一行一行执行。

进入函数(Step Into):进入调用函数内部,下一个执行点在函数第一行。

跳出函数(Step Out):退出当前函数,下一个执行点在函数调用的地方。

继续(Resume/Continue):继续运行,直到下一个断点的到来。

停止(Terminal/Stop):停止程序。


开始调试

    很多同学在第一步就错了。我们是要调试,不是运行程序。Eclipse工具栏会有两个按钮,一个是运行wps103,一个是调试wps104。很多同学一直都点击的是运行按钮,然后怎么设置断点,也无法进入调试模式。

IDEA开发环境倒是直接把两个按钮的功能合并了,省得大家误解。运行虽然比调试省了很多CPU的开销,速度能快一些,但是实际上区别没有那么明显。所以建议大家在开发阶段都使用调试按钮,养成一个良好的工作习惯。

下面我们来做一个例子,看看怎么来一步步的找出问题所在。假设我们业务是这样子的,前台输入车牌号,点击查询,后台通过车牌号查询车辆的具体信息,包括颜色,车长,轴数,司机姓名,联系方式,然后传递到前台,前台显示出来车辆详细信息。我们这里只调试后台代码,也就是从控制器层开始。前台也是可以调试的,我会单独用一个章节来介绍的。

我们后台的代码是这样子的。

wps105

流程就是通过Service取出符合规则的车辆信息,如果参数carNo不为空,取出的列表只有一条,如果为空,取出所有的车辆信息。并且将车辆颜色标识做一个转换,1为红色,2为绿色,3为蓝色。

我们下面举例说明几种常见的问题,及如何来分解决。


场景1: 查看变量值

假设前台输入车牌号,没有传递到后台,导致总是查询不出来指定车牌号的结果。

通过双击代码左侧行号的位置,在函数入口位置设置断点。

wps106

以Debug方式启动程序,然后从前台查询触发后台代码。

wps107

可以看到已经进入断点位置,代码行部分呈现绿色。这时,服务器是处于暂停状态的,我们可以通过鼠标悬浮在变量上,查看当前变量的值。如下图所示:

wps108

我们可以看到carNo变量是空值,所以无法达到预期的效果。


场景2:单步运行

进入断点后,我们想看看颜色标识为1的车辆,颜色转换情况。可以直接将断点设置在if条件里面,

wps109

进入断点后,查看carInfo变量的值。标识确实等于1。

然后使用调试工具栏wps110里面的wps111按钮,代码会执行一行。

wps112

再次查看变量carInfo,发现color字段已经变成”红色”字符串了。


场景3:进入函数,跳出函数

这个例子的取数据函数是Service的getCarInfo(),如果我们想进到这个函数里面,检查一下逻辑,可以通过wps113进入getCarInfo内部。如果查看的差不多了,想跳出这个函数,可以通过wps114按钮退出当前函数。这两个按钮是配合使用的,一般用于调试过程中,临时决定要进去函数内部查看执行结果。


场景4:变量值,动态修改

假如前台显示颜色的时候,能处理红黄蓝绿.但是我们的数据列表里,没有黄色车辆的信息,需要临时伪造出一个黄色车辆信息,传递给前台看看显示效果。我们可以在不修改代码的情况下,通过调试来完成这个任务。

将断点设置在获取完车辆列表之后的任意位置,进入断点后,

wps115

选中list变量,点击鼠标右键,弹出菜单中,选择Watch项,就可以在选项卡中查看变量值了。

wps116

选中某个成员变量的值,可以进行修改,回车后修改生效。

wps117

这种方式也可以用来在在代码中临时改变条件变量的值,使得程序可以进入某些条件进行结果确认。


场景5:条件断点

假如,这个列表有10条数据,我们想在for循环处理第6条数据的时候停住,做一些测试。同学们可能会说,我将断点设置在for开始位置,然后不停的Resume按钮6次就可以了。但这样也太累了,如果再多一个数量级60条记录的位置,你还会这么做吗。答案显然是否定的。

我们先将断点设置在for循环任意的位置,然后鼠标右键点击断点弹出菜单。选择【Breakpoint Properties】,

wps118

在这里选择【Conditional】,下面填上条件就可以了。这里我设置的i==4,表示执行4此后停住。扩展一下,这里还可以使用||, &&进行条件组合。

wps119


总结,其实开发过程中的调试工作是必不可少的,不管是Java语言,还是C#,Php,Node.js等等。任何的开发环境Debug功能都是标配的,而且功能几乎是通用的,只是图标稍微有些不同。大家学会了一样,其他的也就贯通了。有兴趣的同学可以尝试使用 IntelliJ IDEA来做一遍。Debug过程避免了,我们频繁的重启,极大地提高了工作效率,希望同学们能多运用,如果配合快捷键使用,效率翻倍。

posted @ 2021-01-28 09:21  大头菜联盟  阅读(79)  评论(0)    收藏  举报