当前位置: 首页 > news >正文

探索 Java 中的 Bug 世界

在 Java 编程的旅程中,我们不可避免地会遇到各种 Bug。这些 Bug 可能会导致程序出现意外的行为、崩溃或者性能问题。了解 Java Bug 的类型、产生原因以及解决方法,对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。

一、Java Bug 的定义与分类

1. 定义

Bug,即程序中的错误或缺陷,它可能导致程序无法按照预期的方式运行。在 Java 中,Bug 可以表现为多种形式,从简单的语法错误到复杂的逻辑问题和性能瓶颈。

2. 分类

  • 语法错误:这是最容易发现和修复的一类 Bug。当我们编写的 Java 代码不符合 Java 语言的语法规则时,编译器会抛出语法错误。例如,缺少分号、括号不匹配、变量未声明等。语法错误会阻止程序的编译,因此在开发过程中通常会被及时发现和修复。
int a = 10 // 缺少分号,编译器会报错

  • 逻辑错误:逻辑错误是指程序在语法上正确,但在执行过程中产生了错误的结果。这类 Bug 通常比较难以发现,因为程序可以正常编译和运行,但输出的结果与预期不符。例如,算法错误、条件判断错误、循环控制错误等。
int sum = 0;
for (int i = 1; i < 10; i++) {sum += i;
}
System.out.println(sum); // 预期结果为 45,但如果循环条件错误,可能会得到错误的结果

  • 运行时错误:运行时错误是在程序运行过程中发生的错误。这些错误可能是由于输入数据错误、资源不足、内存泄漏等原因引起的。例如,空指针异常、数组越界异常、算术异常等。
int[] arr = new int[5];
System.out.println(arr[10]); // 数组越界,会抛出 ArrayIndexOutOfBoundsException

  • 性能问题:性能问题虽然不是严格意义上的 Bug,但也会影响程序的质量和用户体验。性能问题可能表现为程序运行缓慢、响应时间长、内存占用过高、CPU 使用率过高等。性能问题的原因可能是算法效率低下、数据库查询不合理、资源竞争等。

二、常见 Java Bug 的产生原因

1. 编码错误

  • 粗心大意:编程是一项需要高度专注和细心的工作,但有时候我们会因为粗心大意而引入 Bug。例如,拼写错误、变量名混淆、忘记初始化变量等。
int a = 10;
int b = 20;
int c = a + d; // 变量 d 未声明,这是一个粗心导致的错误

  • 对语言特性理解不深入:Java 语言有很多复杂的特性,如泛型、反射、多线程等。如果对这些特性理解不深入,很容易在使用过程中引入 Bug。例如,在使用泛型时,如果不注意类型擦除的问题,可能会导致类型安全问题;在使用多线程时,如果不注意线程同步和互斥,可能会导致数据不一致或死锁等问题。
List<String> list1 = new ArrayList<>();
List<Integer> list2 = list1; // 泛型不匹配,会在编译时或运行时产生错误

2. 环境因素

  • 不同的 Java 版本:Java 语言在不断发展和演进,不同的版本之间可能会存在一些差异。如果我们的程序在一个版本的 Java 上运行良好,但在另一个版本上出现了问题,可能是由于版本差异导致的。例如,某些方法在旧版本中被弃用,或者在新版本中行为发生了变化。
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(date); // 在 Java 8 及以上版本中,SimpleDateFormat 不是线程安全的,可能会导致问题

  • 第三方库和框架:在 Java 开发中,我们经常会使用第三方库和框架来提高开发效率。但是,这些第三方库和框架也可能存在 Bug,或者与我们的程序不兼容,从而导致问题。例如,某个库的新版本可能引入了不兼容的变化,或者某个库在特定的环境下会出现异常。
import com.example.library.LibClass;public class MyClass {public static void main(String[] args) {LibClass lib = new LibClass();lib.method(); // 如果库中存在 Bug,可能会导致程序出现异常}
}

3. 需求变更和设计缺陷

  • 需求变更:在软件开发过程中,需求变更是很常见的。如果需求变更没有得到妥善处理,可能会导致程序出现 Bug。例如,在程序已经开发完成后,客户要求增加一个新的功能,而这个新功能可能会影响到现有的代码,从而引入 Bug。
class Product {private int id;private String name;private double price;public Product(int id, String name, double price) {this.id = id;this.name = name;this.price = price;}// getters and setters
}class ProductService {public void processProduct(Product product) {// 处理产品逻辑}
}public class Main {public static void main(String[] args) {Product product = new Product(1, "Apple", 5.99);ProductService service = new ProductService();service.processProduct(product);// 需求变更,需要增加产品的重量属性// 如果没有对现有代码进行适当的修改,可能会导致 Bug}
}

  • 设计缺陷:设计缺陷是指在软件设计阶段就存在的问题。这些问题可能是由于对需求理解不透彻、设计方法不当、缺乏可扩展性等原因引起的。设计缺陷通常比较难以发现和修复,因为它们可能会影响到整个程序的结构和逻辑。
class Order {private List<Product> products;private double totalPrice;public Order() {products = new ArrayList<>();totalPrice = 0;}public void addProduct(Product product) {products.add(product);totalPrice += product.getPrice();}// getters and setters
}class OrderService {public void processOrder(Order order) {// 处理订单逻辑}
}public class Main {public static void main(String[] args) {Order order = new Order();Product product1 = new Product(1, "Apple", 5.99);Product product2 = new Product(2, "Banana", 3.99);order.addProduct(product1);order.addProduct(product2);OrderService service = new OrderService();service.processOrder(order);// 设计缺陷:如果订单中的产品数量非常大,计算总价格的方式可能会导致性能问题}
}

三、如何发现和修复 Java Bug

1. 调试工具

  • IDE 调试器:大多数 Java 集成开发环境(IDE)都提供了强大的调试功能。我们可以使用 IDE 的调试器来设置断点、单步执行代码、查看变量的值等,从而帮助我们找到程序中的 Bug。例如,在 IntelliJ IDEA 中,我们可以在代码中设置断点,然后通过调试模式运行程序,当程序执行到断点处时,会暂停执行,我们可以查看当前的变量值、调用栈等信息,从而找出问题所在。
  • 命令行调试器:除了 IDE 调试器,我们还可以使用命令行调试器来调试 Java 程序。例如,JDB(Java Debugger)是一个命令行调试工具,它可以帮助我们在没有 IDE 的情况下调试 Java 程序。使用 JDB 可以设置断点、查看变量的值、执行代码等,虽然不如 IDE 调试器方便,但在某些情况下可能会很有用。

2. 日志记录

  • 日志框架:在 Java 中,有很多优秀的日志框架可供选择,如 Log4j、Logback、Slf4j 等。使用日志框架可以方便地记录程序的运行状态和错误信息,帮助我们在程序出现问题时快速定位问题。例如,我们可以在关键代码处添加日志记录,当程序出现异常时,可以查看日志文件,了解程序在出现问题之前的执行情况,从而找出问题所在。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class MyClass {private static final Logger logger = LoggerFactory.getLogger(MyClass.class);public static void main(String[] args) {try {// 可能会出现异常的代码int result = divide(10, 0);System.out.println(result);} catch (ArithmeticException e) {logger.error("出现算术异常:{}", e.getMessage());}}public static int divide(int a, int b) {return a / b;}
}

  • 日志级别:日志框架通常提供了不同的日志级别,如 DEBUG、INFO、WARN、ERROR 等。我们可以根据需要设置不同的日志级别,以便在程序运行过程中记录不同级别的信息。例如,在开发阶段,我们可以设置日志级别为 DEBUG,以便记录更多的详细信息;在生产环境中,我们可以设置日志级别为 WARN 或 ERROR,只记录重要的错误信息,避免日志文件过大。

3. 代码审查

  • 团队审查:代码审查是一种有效的发现 Bug 的方法。通过让其他开发人员审查我们的代码,可以发现我们自己可能忽略的问题。在团队审查中,开发人员可以互相交流、提出建议,从而提高代码的质量。例如,我们可以组织代码审查会议,让团队成员一起审查代码,或者使用代码审查工具,如 Gerrit、Review Board 等,进行在线代码审查。
  • 自我审查:除了团队审查,我们也可以进行自我审查。在编写代码后,我们可以仔细检查自己的代码,查找可能存在的问题。自我审查可以帮助我们养成良好的编程习惯,提高代码的质量。例如,我们可以检查代码的语法、逻辑、命名规范等,确保代码的正确性和可读性。

4. 单元测试

  • 单元测试框架:单元测试是一种软件开发方法,它通过编写测试用例来验证程序的各个单元(如方法、类)是否正确。在 Java 中,有很多优秀的单元测试框架可供选择,如 JUnit、TestNG 等。使用单元测试框架可以方便地编写和运行单元测试,从而帮助我们发现程序中的 Bug。例如,我们可以使用 JUnit 编写测试用例,对我们的代码进行测试,确保代码的正确性。
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.assertEquals;public class MyClassTest {@Testpublic void testAdd() {MyClass myClass = new MyClass();int result = myClass.add(10, 20);assertEquals(30, result);}
}class MyClass {public int add(int a, int b) {return a + b;}
}

  • 测试覆盖率:测试覆盖率是指测试用例覆盖代码的程度。提高测试覆盖率可以帮助我们发现更多的 Bug。我们可以使用测试工具,如 JaCoCo、Cobertura 等,来测量测试覆盖率。例如,我们可以在项目中集成 JaCoCo,运行单元测试后,查看测试覆盖率报告,了解哪些代码没有被测试覆盖,从而有针对性地编写更多的测试用例。

四、预防 Java Bug 的方法

1. 良好的编程习惯

  • 规范的命名:使用有意义的变量名、方法名和类名,可以提高代码的可读性和可维护性。避免使用模糊、不明确的命名,以免引起误解。例如,使用customerName而不是name作为变量名,可以更清楚地表达变量的含义。
  • 注释:添加适当的注释可以帮助我们更好地理解代码的功能和逻辑。注释应该简洁明了,避免过多的废话。例如,在方法上方添加注释,说明方法的功能、参数和返回值,可以提高代码的可读性。
/*** 计算两个整数的和* @param a 第一个整数* @param b 第二个整数* @return 两个整数的和*/
public int add(int a, int b) {return a + b;
}

  • 代码格式化:保持代码的格式一致,可以提高代码的可读性和可维护性。使用代码格式化工具,如 Google Java Format、Eclipse 自带的代码格式化功能等,可以自动格式化代码,使代码风格更加统一。

2. 代码审查和测试

  • 持续集成和持续部署(CI/CD):使用 CI/CD 工具可以自动化构建、测试和部署我们的代码。在每次代码提交后,CI/CD 工具会自动运行单元测试、集成测试等,确保代码的质量。如果测试失败,CI/CD 工具会及时通知开发人员,以便及时修复问题。例如,我们可以使用 Jenkins、Travis CI 等工具来实现 CI/CD。
  • 代码静态分析工具:代码静态分析工具可以在不运行程序的情况下,分析代码的结构和质量,发现潜在的 Bug 和安全漏洞。例如,FindBugs、PMD、Checkstyle 等工具可以检查代码中的常见问题,如空指针引用、资源泄漏、代码风格等。我们可以在开发过程中集成这些工具,定期运行静态分析,及时发现和修复问题。

3. 学习和掌握 Java 最佳实践

  • 遵循设计模式:设计模式是经过实践验证的解决特定问题的方案。学习和掌握设计模式可以帮助我们提高代码的质量和可维护性。例如,单例模式可以确保一个类只有一个实例;工厂模式可以方便地创建对象;观察者模式可以实现对象之间的松散耦合等。
  • 了解 Java 性能优化技巧:Java 程序的性能问题也是一种常见的 Bug。了解 Java 性能优化技巧可以帮助我们提高程序的性能,避免性能瓶颈。例如,合理使用数据结构、避免不必要的对象创建、使用缓存等。

五、总结

Java Bug 是我们在编程过程中不可避免会遇到的问题。了解 Java Bug 的类型、产生原因以及解决方法,对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。通过使用调试工具、日志记录、代码审查、单元测试等方法,我们可以有效地发现和修复 Java Bug。同时,通过养成良好的编程习惯、进行代码审查和测试、学习和掌握 Java 最佳实践等方法,我们可以预防 Java Bug 的产生。在 Java 编程的旅程中,我们应该不断学习和积累经验,提高自己的编程水平,以更好地应对各种 Bug 的挑战。


希望这篇博客能够帮助你更好地理解和处理 Java Bug。如果你对博客的内容、结构、案例等有任何修改建议或其他想法,欢迎随时交流。

相关文章:

探索 Java 中的 Bug 世界

在 Java 编程的旅程中&#xff0c;我们不可避免地会遇到各种 Bug。这些 Bug 可能会导致程序出现意外的行为、崩溃或者性能问题。了解 Java Bug 的类型、产生原因以及解决方法&#xff0c;对于提高我们的编程技能和开发出稳定可靠的应用程序至关重要。 一、Java Bug 的定义与分类…...

SQL面试题——百度SQL面试题 连续签到领金币

百度SQL面试题 连续签到领金币 今天的这个题目来自百度,而且这个题目很常见,是一个大家日常经常遇到的一个场景,几乎无处不在,就是签到送积分,只不过这里是签到领金币 有用户签到记录表,sign,记录用户当天是否完成签到,请计算出每个用户的每个月获得的金币数量; 签到…...

easyExcel单一下拉框和级联下拉框

文章目录&#xff1a; 单一下拉框级联下拉框 具体实现&#xff1a; 单一下拉框 public class BoolWriteHandler implements SheetWriteHandler {private List<String> dropDown;private List<Integer> indexList;public BoolWriteHandler(List<Integer> i…...

linux-安全-iptables防火墙基础笔记

目录 一、 iptables链结构 五链 二、 iptables表结构 四表 三、 匹配流程 四、 语法 五、 匹配 1. 通用匹配 2. 隐含匹配 3. 显示匹配 六、 SNAT 七、 DNAT 八、 规则备份及还原 1. 备份 2. 还原 这篇将讲解iptables防火墙的基础知识 一、 iptables链结构 规则…...

力扣刷题TOP101: 25.BM32合并二叉树

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的&#xff1a; 已知两颗二叉树&#xff0c;将它们合并成一颗二叉树。合并规则是&#xff1a;都存在的结点&#xff0c;就将结点值加起来&#xff0c;否则空的位置就由另一个树的结点来代替。 思路 我们有两棵二…...

R的中文文本处理包--tmcn

文章目录 介绍tmcn 和 jieba 的关系函数&#xff1a;catUTF8toUTF8实例 介绍 tmcn 包是 R 语言中的一个用于处理和分析中文文本的包&#xff0c;特别适用于中文文本的分词、词频统计和文本挖掘等任务。以下是 tmcn 包的基本用法&#xff0c;包括安装、常用函数和示例。 一个用…...

差异基因富集分析(R语言——GOKEGGGSEA)

接着上次的内容&#xff0c;上篇内容给大家分享了基因表达量怎么做分组差异分析&#xff0c;从而获得差异基因集&#xff0c;想了解的可以去看一下&#xff0c;这篇主要给大家分享一下得到显著差异基因集后怎么做一下通路富集。 1.准备差异基因集 我就直接把上次分享的拿到这…...

scrapy对接rabbitmq的时候使用post请求

之前做分布式爬虫的时候,都是从push url来拿到爬虫消费的链接,这里提出一个问题,假如这个请求是post请求的呢,我观察了scrapy-redis的源码,其中spider.py的代码是这样写的 1.scrapy-redis源码分析 def make_request_from_data(self, data):"""Returns a Reques…...

vue+elementUI+transition实现鼠标滑过div展开内容,鼠标划出收起内容,加防抖功能

文章目录 一、场景二、实现代码1.子组件代码结构2.父组件 一、场景 这两天做项目&#xff0c;此产品提出需求 要求详情页的顶部区域要在鼠标划入后展开里面的内容&#xff0c;鼠标划出要收起部分内容&#xff0c;详情底部的内容高度要自适应&#xff0c;我这里运用了鼠标事件t…...

大模型语料库的构建过程 包括知识图谱构建 垂直知识图谱构建 输入到sql构建 输入到cypher构建 通过智能体管理数据生产组件

以下是大模型语料库的构建过程&#xff1a; 一、文档切分语料库构建 数据来源确定&#xff1a; 首先&#xff0c;需要确定语料库的数据来源。这些来源可以是多种多样的&#xff0c;包括但不限于&#xff1a; 网络资源&#xff1a;利用网络爬虫技术从各种网站&#xff08;如新闻…...

阿里云ECS服务器域名解析

阿里云ECS服务器域名解析&#xff0c;以前添加两条A记录类型&#xff0c;主机记录分别为www和&#xff0c;这2条记录都解析到服务器IP地址。 1.进入阿里云域名控制台&#xff0c;找到域名 ->“解析设置”->“添加记录” 2.添加一条记录类型为A,主机记录为www&#xff0c…...

牛客周赛71:A:JAVA

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 \hspace{15pt}对于给定的两个正整数 nnn 和 kkk &#xff0c;是否能构造出 kkk 对不同的正整数 (x,y)(x,y)(x,y) &#xff0c;使得 xynxynxyn 。 \hspace{15pt}我们认为两对正整数 (…...

查询产品所涉及的表有(product、product_admin_mapping)

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService1. 完整SQL分析可选部分&#xff08;条件筛选&#xff09;&#xff1a; 2. 涉及的表3. 总结4. 功能概述 查询指定管理员下所有产品所涉及的表&#xff1f;…...

算法基础学习Day5(双指针、动态窗口)

文章目录 1.题目2.题目解答1.四数之和题目及题目解析算法学习代码提交 2.长度最小的子数组题目及题目解析滑动窗口的算法学习方法一&#xff1a;单向双指针(暴力解法)方法二&#xff1a;同向双指针(滑动窗口) 代码提交 1.题目 18. 四数之和 - 力扣&#xff08;LeetCode&#x…...

docker 部署 mysql 9.0.1

docker 如何部署 mysql 9 &#xff0c;请看下面步骤&#xff1a; 1. 先看 mysql 官网 先点进去 8 版本的 Reference Manual 。 选择 9.0 版本的。 点到这里来看&#xff0c; 这里有一些基础的安装步骤&#xff0c;可以看一下。 - Basic Steps for MySQL Server Deployment wit…...

关于小标join大表,操作不当会导致笛卡尔积,数据倾斜

以前总是说笛卡尔积&#xff0c;笛卡尔积&#xff0c;没碰到过&#xff0c;今天在跑流程调度时&#xff0c;就碰到笛卡尔积了&#xff0c;本来&#xff0c;就是查询几个编码的信息&#xff0c;然后由于使用的是with tmp as&#xff0c;没使用where in ,所以跑的很慢 现象&#…...

SpringMVC全局异常处理

一、Java中的异常 定义&#xff1a;异常是程序在运行过程中出现的一些错误&#xff0c;使用面向对象思想把这些错误用类来描述&#xff0c;那么一旦产生一个错误&#xff0c;即创建某一个错误的对象&#xff0c;这个对象就是异常对象。 类型&#xff1a; 声明异常&#xff1…...

出海服务器可以用国内云防护吗

随着企业国际化进程的加速&#xff0c;越来越多的企业选择将业务部署到海外服务器上&#xff0c;以便更贴近国际市场。然而&#xff0c;海外服务器也面临着来自全球各地的安全威胁和网络攻击。当出海服务器遭受攻击时&#xff0c;是否可以借助国内的云服务器来进行有效的防护呢…...

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中&#xff0c;实时协作已经成为了非常重要的功能&#xff0c;尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档&#xff0c;多个用户可以同时对同一份文档进行编辑&#xff0c;并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…...

Ant Design Pro实战--day01

下载nvm https://nvm.uihtm.com/nvm-1.1.12-setup.zip 下载node.js 16.16.0 //非此版本会报错 nvm install 16.16.0 安装Ant Design pro //安装脚手架 npm i ant-design/pro-cli -g //下载项目 pro create myapp //选择版本 simple 安装依赖 npm install 启动umi yarn add u…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...