Java学习之断点调试

news2024/11/28 2:38:42

目录

应用场景

重要提示

定义

快捷键

运行图

 案例1

案例2

案例3

案例4

练习题

第一题

题目

 代码

toString方法

 第二题

 题目


应用场景

查找错误时,用断点调试一步一步的看源码执行的过程,从而发现错误所在

重要提示

在断点调试(Debug)过程中,是运行状态,是以对象的运行类型来执行的

断点调式(Debug)过程中,是运行状态,是以对象的运行类型来执行的

eg :A extends B;B b = new A();b.xx();在调试时看运行类型A

定义

断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后程序员可以一步一步往下调试,调试过程中可以看各个变量当前的值,出错的话,调试到出错的代码行即显示错误,停下,进行分析从而找到这个Bug,又叫Debug。

可以查看到java底层源代码的执行过程,提高程序员的Java水平

快捷键

F7(跳入)跳入方法体内执行

F8(跳过)逐行执行代码.

shift+F8(跳出) :跳出方法

F9(resume,执行到下一个断点)

运行图

和老师的IDEA 版本不同,所以有些细节不太一样

 案例1

package com.hspedu.poly_.e1210;

public class Debug01 {
    public static void main(String[] args) {
        //演示逐行执行代码
        int sum = 0;
        for (int i = 0; i < 5; i++) {
            sum += i;
            System.out.println("i=" + i);
            System.out.println("sum=" + i);
        }
        System.out.println("退出 for....");
    }
}

总结:当高光蓝条跳到下一行的时候才会显示上一行的结果

 当蓝条跳到 

for (int i = 0; i < 5; i++) {

这一行时,才会显示出变量 sum = 0

执行完毕后的显示

案例2

数组越界

package com.hspedu.poly_.e1210;

public class Debug02 {
    public static void main(String[] args) {
        int[] arr = {1, 10, -1};
        //数组越界异常
        for (int i = 0; i <= args.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("退出for");
    }
}

 在上述代码中故意将arr.length写成args.length,看一下Debug的流程

 提示一个是args,一个是数组arr

输出控制台直接退出程序了

 修改之后再次Debug

Debug控制台显示

 输出控制台显示

 提成程序员思考为什么i可以等于3

案例3

如何追踪源代码

package com.hspedu.poly_.e1210;

import java.util.Arrays;

public class Debug03 {
    public static void main(String[] args) {
        int[] arr = {1, -1, 10, -20, 100};
        //直接使用IDEA提供的方法进行排序
        //需求:想看一下Arrays.sort的底层实现
        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            //在Debug之前是按照排序正常输出
            System.out.print(arr[i] + "\t");
        }
    }
}

 设置完毕后可按F7(Step Into)进入Arrays.sort方法的底层源码

再次 Step Into

 可以一直Step Into,直到找到最底层的源代码

返回(跳出的时候就是Shift + F8,即Step Out)

案例4

演示Resume功能,快捷键F9

package com.hspedu.poly_.e1210;

import java.util.Arrays;
//演示执行到下一个断点,同时支持动态的下断点
public class Debug04 {
    public static void main(String[] args) {
        int[] arr = {1, -1, 10, -20 , 100};
         //直接使用IDEA提供的方法进行排序
        //需求:想看一下Arrays.sort的底层实现
        Arrays.sort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println("hello100");
        System.out.println("hello200");
        System.out.println("hello300");
        System.out.println("hello400");
        System.out.println("hello500");
        System.out.println("hello600");
        System.out.println("hello700");
    }
}

 在第10行和第17行分别下一个断点,在运行Debug之后,按Reseum键,

 直接跳到了第二个断点,中间代码的结果也全都输出了

 此时Debug还在运行中,但是还可以下断点并运行

练习题

第一题

题目

 代码

创建一个Person,有两个private属性,显示定义构造器,重写toString方法,可以输出对象的属性

package com.hspedu.debug_;

public class DebugExercise01 {
    public static void main(String[] args) {
        
        //创建对象的流程
        //(1)加载Person类信息
        //(2)初始化 2.1默认初始化,2.2显式初始化 2.3构造器初始化
        //返回对象地址(知识点:7.9 对象创建的流程分析)
        Person person = new Person("jack", 23);
        System.out.println(person);

    }
}
class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

在Person person = new Person("jack", 23);一行下断点

Force Step Into进入ClassLoader.java(我的没有成功,以下是课程截图),

即第一步:加载Person类信息

 第二步:默认初始化(name 为null; age 为0);无法查看

第三步:显式初始化,这里没有给属性赋值

第四步:构造器初始化

 

 属性name从null------->jack;age从0------>23

toString方法

Debug输出对象语句,查看是如何调用toString方法

 Force Step Into

再次Force Step Into

 

 即(Object obj) 传入一个Person类对象person,此时已经向上转型了

三元运算符号,判断传入的对象是否为null,如果≠null,则调用toString方法,运行类型是Person,运行Person类重写的Object类的toString方法(动态绑定机制)


再次Force Step Into,Person类重写的Object类的toString方法

 连续Step Over

输出 

 

 

 第二题

 题目

使用断点调试,查看动态绑定机制的工作原理

动态绑定机制的代码

package com.hspedu.debug_;

public class DeBugExercise02 {
    public static void main(String[] args) {
        //向上转型,编译类型是A,运行类型是B
        A01 a = new B01();
        //从子类-B类中开始查找
        System.out.println(a.sum());//20+20//30
        System.out.println(a.sum1());//20+10//20
    }
}
class A01 {//父类
    public int i = 10;

    public int sum() {
        return getI() + 10;
    }

    public int sum1() {
        return i + 10;
    }

    public int getI() {
        return i;
    }
}
class B01 extends A01 {//父类
    public int i = 20;

//    public int sum() {
//        return i + 20;
//    }

    public int getI() {
        return i;
    }
//    public int sum1() {
//        return i + 10;
//    }

}

Force Step Into

 根据动态绑定机制,调用方法时看运行类型,对象a的的运行类型是B01类,所以先从子类开始查找,由于B01类没有这个方法,就向上父类-A01类中查找

 再次Force Step Into

属性是哪里声明就调用哪里的,所以是调用B01的属性20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/85660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建hadoop单机环境

hadoop 笔记 sbin: 一些启动脚本 【服务端的 server bin】logs: 存放 hadoop 相关日志bin: 客户端的脚本etc: hadoop 相关的配置文件 格式化文件系统 配置免密码登录 ssh-keygen -t rsa -P -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys# 启动…

Android DataBinding之布局中(layout)事件、运算逻辑、资源、工具类的使用与详解(七)

一、介绍 如果你学习了我前面的六篇文章&#xff0c;基本能够熟悉的处理data binding在开发过程的大多数业务&#xff0c;但是由于layout中的数据不一定满足UI上的效果&#xff0c;正常都是提前处理好数据&#xff0c;如果我们在layout引入中事件、运算逻辑、资源、工具类&…

【离散数学】代数系统 测试

1.判断题 代数系统中一个元素的左逆元一定等于该元素的右逆元。 正确答案&#xff1a; 错误 2.判断题 一个循环群的生成元不是唯一的。 正确答案&#xff1a; 正确 3.判断题 任何循环群必定是阿贝尔群&#xff0c;反之亦真。 正确答案&#xff1a; 错误 4.判断题 任何一个循环群…

gitlab-runner 的安装

Gitlab-ci说明 是GitLab内置的进行持续集成的工具&#xff0c;只需要在仓库根目录下创建.gitlab-ci.yml 文件&#xff0c;并配置GitLab Runner&#xff1b;每次提交的时候&#xff0c;gitlab将自动识别到.gitlab-ci.yml文件&#xff0c;并且使用Gitlab Runner执行该脚本 Gitl…

关于Redis数据库,我问了ChatGPT几个问题

最近互联网刮起了一阵ChatGPT风&#xff0c;从程序猿、产品经理、运营再到大学生&#xff0c;都在跟ChatGPT对话&#xff01;例如&#xff1a; 请帮我检查这段代码的BUG 请帮我设计一款功能像虹科VUZIX一样的智能AR眼镜 虹科Domo数据可视化工具有什么功能 帮我写一篇关于Weka并…

(C1)卷积层特点及torch.nn.Conv2d()

卷积层 文章目录卷积层一、常规卷积1.1 特点1.2 参数量 和 计算量二、可分离卷积2.1 逐深度卷积(Depthwise Convolution)2.2 逐点卷积(Pointwise Convolution)三、代码实现 ⭐一、常规卷积 参考资料 卷积神经网络之卷积层中的多输入多输出通道 卷积中参数量和计算量 有图文讲解…

数字孪生堆场集成箱的管理运维,可视化构建

为优化集装箱码头生产作业流程、提高生产效率&#xff0c;借鉴数字孪生在工业体系应用的经验&#xff0c;采用数字孪生技术对集装箱码头堆场这一典型的具有不确定性、多目标、复杂性的离散内部交通物流系统进行数字化运维&#xff0c;可显著提升作业效率。数字孪生技术正在成为…

(17)深度点云学习--python安装openni打开奥比中光RGBD

1、主要参考 &#xff08;1&#xff09;安装 点云数据处理之安装python-openni_mengjiexu_cn的博客-CSDN博客_openni python &#xff08;2&#xff09;打开摄像头 2、安装openni和测试摄像头 2.1 下载安装摄像头驱动 &#xff08;1&#xff09;去以下地址下载驱动 https…

为什么 OpenCV 计算的视频 FPS 是错的

作者 | 王伟、刘一卓 导读 网络直播功能作为一项互联网基本能力已经越来越重要&#xff0c;手机中的直播功能也越来越完善&#xff0c;电商直播、新闻直播、娱乐直播等多种直播类型为用户提供了丰富的直播内容。 随着直播的普及&#xff0c;为用户提供极速、流畅的直播观看体验…

通过商业智能(BI)可视化数据分析了解布洛芬的产销情况

我们都知道&#xff0c;在我们的生活中&#xff0c;处处都是数据。但是只有数据&#xff0c;比如1、2、45、68、137.5&#xff0c;这些数据单一来看并不能反映任何问题。必须通过数据的分析才能将这些单一、无意义的数字变成我们能了解的信息。简单来说&#xff0c;就是数据≠信…

将多个Word表格中的指定值提取到Excel中,方便查看、统计、汇总。Word精灵

01需求说明 图1是简历样&#xff0c;简历中各项数据都放在表格中。现要求将图2中所有简历表的姓名、性别、出生日期、学历、籍贯、民族等等信息逐一提取出来&#xff0c;整理到Excel中&#xff0c;方便查看及汇总。 图1 简历表 图2 要汇总的简历表 02操作步骤 要提取所有简…

C#启程—开发环境搭建

文章目录ideRider下载和安装创建C#基础工程&#xff08;.Net_Desktop_Form&#xff09;Rider去除语法警告C#笔记namespace找不到某个class&#xff08;命名空间&#xff09;ide Rider ide我们选择Rider 为何不选vs&#xff1f;vs占硬盘内存太高了&#xff08;20多G&#xff0…

DATAKIT CrossManager 2022.4 Crack

CrossManager 是一款独立软件&#xff0c;可让您转换大多数 CAD 格式的文件。 使用 Cross Manager&#xff0c;您只需选择一个或多个 CAD 文件&#xff0c;即可将它们自动翻译成您想要的格式。 DATAKIT CrossManager是一款独立软件&#xff0c;可让您转换大多数 CAD 格式的文件…

java对接打码平台用selenium实现对图片验证码识别(对接文档看这一个就够了)

在很多平台软件中&#xff0c;咱们登录之后都有一些验证&#xff0c;例如图片数字验证&#xff0c;还有现在流行的滑块验证码&#xff0c;点选验证码&#xff0c;这么复杂的事情&#xff0c;我们程序员当然要用程序的方式解决啦&#xff0c;所以也有一些平台提供了快捷验证的方…

ElasticSearch的读写更新数据流程

读数据流程 客户端向 Node1&#xff08;协调节点&#xff09; 发送获取请求。节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。为了负载均衡&#xff0c;可以轮询所有节点&#xff0c;最后它将请求转发到 Node 2 。Node 2 将文档返回给 N…

通达信接口最新版wind量化特征

通达信接口最新版wind量化特征 1、通达信接口最新版交易接口用于什么&#xff1f; MetaTrade.dll它是一个股票交易接口&#xff0c;可以用于股票程序交易。通过将你的交易策略编写为代码&#xff0c;并通过调用接口股票、撤单、查询&#xff0c;从而实现股票自动交易的程序化。…

【开发工具】Office Tool Plus 安装 Office

一、安装Office&#xff1a; 第一步&#xff1a;打开Office Tool Plus&#xff0c;没有的去官网下载&#xff1a; Office Tool Plus 官方网站 - 一键部署 OfficeOffice Tool Plus 是一个用于部署、激活 Office、Visio、Project 的小工具。借助本工具&#xff0c;你可以快速地…

web前端期末大作业——开心旅游网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

STM32F4 | SYSTEM文件夹介绍 | delay文件夹 | sys文件夹 | usart文件夹

文章目录一、delay 文件夹代码介绍1.delay_init 函数2.delay_us 函数3.delay_ms函数二、sys 文件夹代码介绍1.IO 口的位操作实现三、usart 文件夹代码介绍1.printf 函数支持在 新建工程模板——库函数版本中&#xff0c;我们用到了一个 SYSTEM 文件夹里面的代码&#xff0c;此…

基于java+springboot+mybatis+vue+mysql的智慧养老平台

项目介绍 随着社会的发展我国的人口老龄化严重&#xff0c;为了让这些在年前是给社会做出过贡献的老人老有所依&#xff0c;老有所养&#xff0c;度过一个安详的晚年&#xff0c;很多地方都实现了智慧养老&#xff0c;为此我们通过springbootvueelementUI 开发了本次基于java的…