Debug讲解_CodingPark编程公园
发布日期:2021-06-29 15:46:39
浏览次数:2
分类:技术文章
本文共 7821 字,大约阅读时间需要 26 分钟。
Debug简介
-
什么是程序DeBug?
-
Debug,是程序开发人员必会的一项调试程序的技能。
-
企业中程序开发和程序调试的比例为1:1.5,可以说如果你不会调试程序,你就没有办法从事编程工作。
-
-
Debug能帮助我们做什么?
- 追踪代码的运行流程。
- 程序运行异常定位。
- 线上问题追踪。
-
Debug对于程序学习者的意义
- 通过调试能够更好的查看程序的执行流程。
- 复杂的程序逻辑,通过老师的口述讲解,很难理解清楚,这个时候借助调试能够很好的帮助同学们理解程序。
- 定位问题,提高自我解决问题的能力。
IDEA中的Debug步骤
观察变量
- 查看变量有三种方式:
- 程序区查看变量
- Debugger的Variables中查看变量
- 鼠标悬停到变量名上会弹出当前变量的值
/** * @Author: TEAM-AG * @Description: 调试基本介绍 * @Date: Created in 14:15 2020-05-28 * @Modified By: */public class Corgi_debug1 { public static void main(String[] args) { int num = 1; System.out.println("num = " + num); num ++; System.out.println("num = " + num); num ++; System.out.println("num = " + num); num ++; System.out.println("num = " + num); num ++; System.out.println("num = " + num); num ++; System.out.println("num = " + num); num ++; System.out.println("num = " + num); System.out.println("end..."); }}
步过和步入调试的使用
- 步过调试 步过调试按钮(F8)
- 作用 步过,一行一行地往下走,如果这一行上有方法不会进入方法。 常用于调试过程中不想进入调用的方法体的情况。
-
步入调试
步过调试按钮(F7)
-
作用
步入,一行一行地往下走,如果这一行上有方法,则进入方法内部。
一般用于进入自定义方法内,不会进入官方类库的方法。
import org.jetbrains.annotations.Contract;/** * @Author: TEAM-AG * @Description: 步过和步入调试的使用 * @Date: Created in 15:27 2020-05-28 * @Modified By: */public class Corgi_debug2 { public static void main(String[] args) { int a1 = add(1, 2); System.out.println(a1); int a2 = add(2, 3); System.out.println(a1 + a2); int result = a1 + a2; System.out.println(result); } @Contract(pure = true) private static int add(int a, int b){ int result = a+b; return result; }}
强制步入和步出
import java.util.ArrayList;import java.util.Iterator;/** * @Author: TEAM-AG * @Description: 强制步入和步出&并发修改异常 * @Date: Created in 16:13 2020-05-28 * @Modified By: */public class Corgi_debug3 { public static void main(String[] args) { System.out.println("begin..."); operatorList(); System.out.println("end..."); } private static void operatorList() { ArrayListlist1 = new ArrayList<>(); list1.add("Corgi"); list1.add("CC"); list1.add("Jim"); list1.add("JACK"); //获取集合迭代器 Iterator iterator1 = list1.iterator(); while (iterator1.hasNext()) { String name = iterator1.next(); if(name.equals("Jim")) { //改变集合元素个数 list1.add("JimAdd"); } } }}
计算表达式
/** * @Author: TEAM-AG * @Description: 计算表达式 * @Date: Created in 16:53 2020-05-28 * @Modified By: */public class Corgi_debug4 { public static void main(String[] args) { User user = new User("Corgi", "123456","超级管理员"); login(user); } private static void login(User user) { String userType = user.getUserType(); switch (userType) { case "超级管理员": System.out.println("超级管理员业务逻辑"); break; case "董事长": System.out.println("董事长业务逻辑"); break; case "经理": System.out.println("经理业务逻辑"); break; case "员工": System.out.println("进入员工业务逻辑"); break; default: System.out.println("角色不存在"); break; } }}class User{ private String userName; private String pwd; private String userType; public User(String userName, String pwd, String userType) { this.userName = userName; this.pwd = pwd; this.userType = userType; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getUserType() { return userType; } public void setUserType(String userType) { this.userType = userType; }}
条件断点
-
作用
通过设置断点条件,在满足条件时,才停在断点处,否则直接运行。
/** * @Author: TEAM-AG * @Description: 条件断点 * @Date: Created in 17:10 2020-05-28 * @Modified By: */public class Corgi_debug5 { public static void main(String[] args) { for (int i = 1; i < 1000; i++) { execute(i); } } private static void execute(int num) { int rs = ((num + 3) * 5 + 9) / num; System.out.println(rs); }}
多线程调试
案例1
/** * @Author: TEAM-AG * @Description: 多线程调试-案例1 * @Date: Created in 21:04 2020-05-28 * @Modified By: */public class Corgi_debug6 { public static void main(String[] args) { Thread thread1 = new Thread(new MyRunnable(), "曹操"); Thread thread2 = new Thread(new MyRunnable(), "刘备"); Thread thread3 = new Thread(new MyRunnable(), "孙权"); thread1.start(); thread2.start(); thread3.start(); }}class MyRunnable implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "____进入"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "____离开"); }}
案例2
package Milk;/** * @Author: TEAM-AG * @Description:多线程调试-案例2 * @Date: Created in 10:58 2020-05-29 * @Modified By: */public class MainClass { public static void main(String[] args) { Box box = new Box(); Producer producer = new Producer(box); Consumer consumer = new Consumer(box); Thread thread1 = new Thread(producer, "生产者"); Thread thread2 = new Thread(consumer, "消费者"); thread1.start(); thread2.start(); }}
package Milk;/** * @Author: TEAM-AG * @Description: BOX * @Date: Created in 10:58 2020-05-29 * @Modified By: */public class Box { private int milk; private boolean state = false; public void put(int milk){ System.out.println("put begin"); synchronized (this){ if (state){ try{ System.out.println("put wait"); wait(); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("put wait end"); } this.milk = milk; System.out.println("送奶工将第" + this.milk + "瓶牛奶放入奶箱"); this.state = true; notifyAll(); } System.out.println("put end"); } public void get() { System.out.println("get begin"); synchronized (this) { if (!state) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("用户拿到第" + this.milk + "瓶牛奶"); this.state = false; notifyAll(); } System.out.println("get end"); }}
package Milk;/** * @Author: TEAM-AG * @Description: Producer * @Date: Created in 10:58 2020-05-29 * @Modified By: */public class Producer implements Runnable { private Box box; public Producer(Box box) { this.box = box; } @Override public void run() { for (int i=1; i<=5; i++){ box.put(i); } }}
package Milk;/** * @Author: TEAM-AG * @Description: Consumer * @Date: Created in 10:58 2020-05-29 * @Modified By: */public class Consumer implements Runnable { private Box box; public Consumer(Box box) { this.box = box; } @Override public void run() { for (int i=1; i<=5 ;i++){ box.get(); } }}
更多信息
📍IDEA_Debug
https://www.bilibili.com/video/BV1LJ41187hu?p=1
转载地址:https://codingpark.blog.csdn.net/article/details/106422209 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月27日 13时55分21秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
数字化转型的主干道上,华为云以“三大关键”成企业智能化推手
2019-04-29
数字化为何不走“捷”“径”?
2019-04-29
和总裁、专家交朋友,华为云助推政企智能化升级又做到前面去了
2019-04-29
BCOP章鱼船长,6月22日晚上8点上线薄饼
2019-04-29
为战疫助力,半导体功不可没
2019-04-29
了解这些操作,Python中99%的文件操作都将变得游刃有余!
2019-04-29
知道如何操作还不够!深入了解4大热门机器学习算法
2019-04-29
只有经历过,才能深刻理解的9个编程道理
2019-04-29
发现超能力:这些数据科学技能助你更高效专业
2019-04-29
AI当道,人工智能将如何改变金融业?
2019-04-29
消除性别成见,技术领域需要更多“乘风破浪的姐姐”
2019-04-29
7行代码击败整个金融业,这对20多岁的爱尔兰兄弟是如何做到的?
2019-04-29
2020十大编程博客:私藏的宝藏编程语言博客大放送!
2019-04-29
编程中的角色选择:哪类工作角色最适合你?
2019-04-29
10种算法一文打尽!基本图表算法的视觉化阐释
2019-04-29
未来属于人工智能工程师,但成功转型不容易
2019-04-29
科技界“挠头”:困扰科技界可持续发展的难题
2019-04-29
20年后,这5种编码语言可能就消失了……
2019-04-29
标准出现问题,人工智能正在走向错误的方向
2019-04-29
如何使用Python实现最低有效位隐写术?
2019-04-29