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工具栏会有两个按钮,一个是运行
,一个是调试
。很多同学一直都点击的是运行按钮,然后怎么设置断点,也无法进入调试模式。
IDEA开发环境倒是直接把两个按钮的功能合并了,省得大家误解。运行虽然比调试省了很多CPU的开销,速度能快一些,但是实际上区别没有那么明显。所以建议大家在开发阶段都使用调试按钮,养成一个良好的工作习惯。
下面我们来做一个例子,看看怎么来一步步的找出问题所在。假设我们业务是这样子的,前台输入车牌号,点击查询,后台通过车牌号查询车辆的具体信息,包括颜色,车长,轴数,司机姓名,联系方式,然后传递到前台,前台显示出来车辆详细信息。我们这里只调试后台代码,也就是从控制器层开始。前台也是可以调试的,我会单独用一个章节来介绍的。
我们后台的代码是这样子的。
流程就是通过Service取出符合规则的车辆信息,如果参数carNo不为空,取出的列表只有一条,如果为空,取出所有的车辆信息。并且将车辆颜色标识做一个转换,1为红色,2为绿色,3为蓝色。
我们下面举例说明几种常见的问题,及如何来分解决。
场景1: 查看变量值
假设前台输入车牌号,没有传递到后台,导致总是查询不出来指定车牌号的结果。
通过双击代码左侧行号的位置,在函数入口位置设置断点。
以Debug方式启动程序,然后从前台查询触发后台代码。
可以看到已经进入断点位置,代码行部分呈现绿色。这时,服务器是处于暂停状态的,我们可以通过鼠标悬浮在变量上,查看当前变量的值。如下图所示:
我们可以看到carNo变量是空值,所以无法达到预期的效果。
场景2:单步运行
进入断点后,我们想看看颜色标识为1的车辆,颜色转换情况。可以直接将断点设置在if条件里面,
进入断点后,查看carInfo变量的值。标识确实等于1。
再次查看变量carInfo,发现color字段已经变成”红色”字符串了。
场景3:进入函数,跳出函数
这个例子的取数据函数是Service的getCarInfo(),如果我们想进到这个函数里面,检查一下逻辑,可以通过
进入getCarInfo内部。如果查看的差不多了,想跳出这个函数,可以通过
按钮退出当前函数。这两个按钮是配合使用的,一般用于调试过程中,临时决定要进去函数内部查看执行结果。
场景4:变量值,动态修改
假如前台显示颜色的时候,能处理红黄蓝绿.但是我们的数据列表里,没有黄色车辆的信息,需要临时伪造出一个黄色车辆信息,传递给前台看看显示效果。我们可以在不修改代码的情况下,通过调试来完成这个任务。
将断点设置在获取完车辆列表之后的任意位置,进入断点后,
选中list变量,点击鼠标右键,弹出菜单中,选择Watch项,就可以在选项卡中查看变量值了。
选中某个成员变量的值,可以进行修改,回车后修改生效。
这种方式也可以用来在在代码中临时改变条件变量的值,使得程序可以进入某些条件进行结果确认。
场景5:条件断点
假如,这个列表有10条数据,我们想在for循环处理第6条数据的时候停住,做一些测试。同学们可能会说,我将断点设置在for开始位置,然后不停的Resume按钮6次就可以了。但这样也太累了,如果再多一个数量级60条记录的位置,你还会这么做吗。答案显然是否定的。
我们先将断点设置在for循环任意的位置,然后鼠标右键点击断点弹出菜单。选择【Breakpoint Properties】,
在这里选择【Conditional】,下面填上条件就可以了。这里我设置的i==4,表示执行4此后停住。扩展一下,这里还可以使用||, &&进行条件组合。
总结,其实开发过程中的调试工作是必不可少的,不管是Java语言,还是C#,Php,Node.js等等。任何的开发环境Debug功能都是标配的,而且功能几乎是通用的,只是图标稍微有些不同。大家学会了一样,其他的也就贯通了。有兴趣的同学可以尝试使用 IntelliJ IDEA来做一遍。Debug过程避免了,我们频繁的重启,极大地提高了工作效率,希望同学们能多运用,如果配合快捷键使用,效率翻倍。












浙公网安备 33010602011771号