前言❤️❤️
hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹 这篇文章补充了在工作中调试的一套流程,同时也拿斐波那契数列代码来进行调试。 强烈建议大家再看下方法博客的9.2部分(文章链接放在本篇文章中的2.2部分了),里面有对于递归代码的调试的系统讲解,看完帮助对调试的理解
🎇个人主页:洋不写bug的博客 🎇所属专栏:Java学习之旅,从入门到进阶 🎇铁汁们对于Java的各种常用核心语法(不太常用的也有😆),都可以在上面的Java专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~
1,调试简介
这篇文章我们就更加全面的讲解一下调试的具体步骤和调试的意义。
1,重要性
作为一个程序员来说,如果每天按工作8个小时来计算,那么大概就只要2个多小时在写代码,其他的时间大部分都在调试代码。 不管写的代码报错,还是不符合实际需求,都可以被视为bug。 一般来说,产品经理(PM)向我们提出一个程序的要求,我们程序员写出后,自己先进行调试,包括一些代码中的错误和一些不符合要求地方的修改。
调试对Java的入门也是很重要的,在学校的时候,会遇到有的同学程序运行出错,然后找AI改,或者问别人 其实会调试的话,几分钟内就能找出问题所在,而且是自己检查的逻辑,远比AI的几句话要理解的透彻 有些代码运行出错,可能检查很多遍也找不出问题,但是学会调试,就能很快解决
除此之外,调试对于理解难的代码很有帮助,调试相当于就是让我们看内部的执行逻辑
总之,无论是学校学习阶段还是工作,调试是必须掌握的一门技能!!!😊
2,工作中调试的基础步骤
通常在工作中解决bug分为以下几个步骤:
1,提出问题(bug):测试提出,测试是一门职业(也被称为测开,即测试开发),专门测试别人代码中的错误,是公司中必不可少的。
2,确认问题,程序员确定到底是哪方面的问题,就比如说是代码一些地方出错,还是说没有满足产品要求,进而更改
3,定位,有的大项目有数十万行,那么程序员就要定位到底是哪一行/哪几行,或者哪一片的代码,进一步进行精确筛查,可以进行二分查找,一片一片测试,看到底是哪一片的执行结果不符合预期,反复进行后,代码的范围就能不断地缩小。
4,解决问题:根据定位到的代码的位置,分析出原因,给出解决方案,并解决问题。
5,回归测试:程序员自己先测试一遍,目的是为了排除一些比较明显的问题,包括是否修复了以前的bug,这次修改代码是否引入了新的bug,是否影响到了以前的功能。 注意:这里以前的功能可能非常多,测试工作量非常大,那么我们就通常采用自动化测试,也就是写代码,用代码来测试代码。
2,调试具体讲解
1,工作时的调试
具体的调试方式: 1,日志:直接打上语句,System.out.println
2,调试器:给代码中增加断点,观察程序在停到断点位置时中间变量的数值(相当于就是直接看内存了)。
这两种方法的核心思路都是二分法,判定问题是出现在前面还是后面了。
但是这里我们注意一点,在以后的开发中,其实有90%的情况都是通过日志来调试的,而使用调试器的情况仅为10%左右(就比如我们在IDEA中调试就是通过调试器调试) 日志(Log)是程序、系统或设备在运行过程中,对自身状态、操作行为、事件发生等信息的实时记录。 在开发程序的时候,就会在程序运行的关键环节,提前把日志加好,先通过日志,把问题的范围缩小,这时候基本上已经能定位出问题的具体位置,如果范围过大,就再次使用日志或调试器。
调试器的缺点:一些bug是概率性的(比如千分之一),我们使用调试器的时候,就算调试多次,可能也察觉不到这个bug,但是如果送到用户手上,可能一个软件有数十万用户,那就会在几十个用户使用时出现bug,可能会造成不不小的损失。
那么如何给代码添加日志呢???
其实没啥技巧,只要把你所认为的代码的关键环节,加上打印语句即可😅
但是注意,这里的打印并不是用System.out.println,而是使用使用专门的日志库/日志框架来打印的(这个在JAVAEE,也就是Java的进阶中会学,现在只是了解一下),把日志保存在文件中,可以按照时间分片
调试器 各种调试器的功能其实大同小异 核心功能其实就是两个:
打断点:程序执行到断点位置,就会停下来。 查看中间变量,在程序停下来的时候查看。
2,学习阶段的调试
在方法讲解的博客中已经使用调试来看递归的逻辑,里面也有详细的调试步骤,这里建议铁汁们先看下方法讲解的博客里面有关调试的内容(链接如下),在9.2部分 方法讲解博客
就拿求斐波那契数列的这段代码来进行调试
public class exercise {
public static void main(String[] args) {
System.out.println(fib(4));
}
public static int fib(int n){
if(n == 1 || n == 2){
return 1;
//一位数
}
int last2 = 1;//last是上一次的意思,last2就是前面两个,也就是所求数前面两个数的第一个
int last1 = 1;//last1就是前面一个,也就是所求数前面两个数的第二个
//我们分析一下可以得出,last1是要大于last2的
int cur = 0;//当前项
for(int i = 3;i <= n;i++){
cur = last1 + last2;
//更新前两项
last2 = last1;
last1 = cur;
}
return cur;
}
}
在什么地方打断点呢? 当然是一些核心的逻辑处,就比如说这个代码,比较重要的就是一个判断逻辑(其实这里不打也行)和一个循环逻辑,那就在这些地方打上断点
接下来点击右上角的小乌龟,或者右键鼠标点击测试(debug)
接着开始调试,一般就是无脑按f9,就会一步一步走,就能很清楚的看到逻辑 在代码的旁边也能看到判断结果能看到判断结果,或者当今的数据值
另外,在下面的线程变量框(Threads & Variables)里也能看到这些变量的值随着程序的一步一步运行而在变化。
结语💕💕
在学习阶段,不要一遇到bug就立马粘给AI,然后大概看一下,就过了,一定不要嫌麻烦,要静下心来,去进行调试,找出bug,这个过程也是我们的技术快速进步的一个过程
🥳🥳大家都学废了吗?完结撒花~ 🎉🎉🎉