【Java学习笔记】异常处理
生活中我们在使用一些产品的时候,经常会碰到一些异常情况。例如,使用ATM机取钱的时,机器会突然出现故障导致无法完成正常的取钱业务,甚至吞卡;在乘坐地铁时,地铁出现异常无法按时启动和运行;使用手机时,手机突然自动关机,等等。这些产品的异常情况,有些是系统硬件的问题,但更多的情况是软件出现了问题。
使用Java开发软件时,无论程序员多么小心谨慎,产品反复测试,还是会出现程序错误的现象。所以,优秀的编程语言可以为程序员提供高效、可靠的错误处理机制,便于开发高质量的软件产品。
Java语言提供了一种面向对象异常处理机制来报告和处理错误,这种异常处理机制对异常的处理都封装在异常类中完成。程序在运行过程中,如果出现异常,则会抛出一个异常类对象。
1.异常的概念
- 在程序的设计过程中通常会遇到两种不可避免的错误:编译错误和运行错误。
- 编译错误是由于编写的程序不符合程序的语法规定而导致的语法问题。大部分的编译错误,是由于对编程语言的语法不熟悉或拼写错误引起的。如果违反了编程语言规则,就会导致程序编译错误。
- 运行错误是指能够顺利的编译通过,在程序运行过程中产生的错误。例如:操作文件时文件无法找到,没有给对象开辟内存空间等。如果出现这样的错误,程序会停止运行,但是这样的错误,不容易被发现和排除。
- java中的异常处理机制,为程序提供了清晰的异常终止和处理错误的接口。当异常发生时,发生异常的方法抛出一个封装了错误信息的异常对象。此时,程序不会继续运行,发生错误的方法也不会返回正常运行的值。异常处理机制开始搜索异常处理器来处理这种错误。
- 异常(Exception)是一个在程序运行期间发生的事件。它会终端正在运行中的程序。Java中常见的异常包括 数组下标越界(ArrayIndexOfBoundsException)、空指针异常类(NullPointerException)、算术异常(ArithmeticException)、字符串转换为数字异常(NumberFormatException)、类型不存在异常(TypeNotPresentException)等。
2.异常的基本样式
与java异常处理的相关关键字包括try、catch、throw和finally等,异常的基本样式也使用这些关键字。
- 基本样式:
methodname(){try{...... //可能产生异常的语句或方法程序块}catch(ExceptionType1 e){...... //对异常类型ExceptionType1对象的处理}catch(ExceptionType2 e){...... //对异常类型ExceptionType2对象的处理throw(e) //再抛出这个异常}finally {......//无论是否抛出异常,都需要执行的代码块
}
}
在方法内:
- try语句内是用户监视的可能出现异常的程序语句和方法。
- catch语句快内是用户对抛出异常对象的处理语句。
- throw语句块内是手动抛出一个异常给函数method()的上级执行者,
- finally语句块内,是必须在函数method()返回之前执行的代码。
【例】异常处理简单示例

3.java异常类
java异常类都是由Throwable类派生而来的。派生出的两个分支分别是Error类和Exception类。
3.1异常的层次结构
异常类是一种特殊类,表示的是一种特殊的运行错误,用于处理异常。在Java程序设计中,异常对象都是从Throwable类派生的实例。

- error用于处理在运行过程中发生的系统内部错误和资源耗尽错误。
应该尽量不出现Error类的错误。因为一旦出现了这样的错误,除了通知用户并使线程安全终止,用户也无能为力。
通常Java程序不对Error类异常进行处理。并且这类错误也很少出现。 - Exception类又分为多个分支,这些分支可以分为两类,一类是派生于RunTimeException的异常。一类是派生于IOException的异常,
RunTimeException异常是由于程序错误导致的异常,IOException异常是本来可以正常运行的程序,在操作文件删除或者文件名修改等特殊情况下发生异常而导致程序不能正常运行。
派生于Throwable类的常用异常
| 被终止异常(InterruptedException) | 某个线程处于长时间的等待、休眠或其他暂停状态,其他线程通过Thread类的interrupt()方法终止该线程时抛出的异常 |
| 方法不存在异常(NoSuchMethodException) | 访问某个类的不存在方法时抛出的异常 |
| 找不到类异常(ClassNotFoundException) | ClassNotFoundException 表示在尝试加载类时找不到该类。这可能发生在运行时,通常是由于类路径不正确或缺少相应的类文件 |
| 不支持克隆异常(CloneNotSupportedException) | 当没有实现Cloneable接口或者不支持克隆方法时调用其clone方法抛出该异常 |
派生于RuntimeException类的常用异常
| 算术运算异常(ArithmeticException) | 整数除0时抛出这个异常 |
| 类造型异常(ClassCstException) | |
| 数组越界异常(ArrayIndexOutofBoundsofException) | |
| 数组存储异常(ArrayStoreException) | |
| 访问空指针(NullPointException) |
由IOException类派生的异常
| 文件已结束异常(EOFException) | |
| 文件未找到异常(FileNotFoundException) |
3.2异常处理方法
【例】

4.异常捕获
企业针对产品的异常,会使用一些关键字进行描述和处理。如:产品平均无故障时间、产品故障率、召回等。java的异常处理是通过5个关键词来实现的。分别是try catch throw throws finally 。
其中,try用来存放可能发生一个或多个异常的Java语句,catch语句块用来捕获try语句块抛出的异常。finally语句块用来存放释放的资源和句柄等。
4.1 异常捕获处理语块
为了捕获异常,需要使用catch语句块来配合try语句块。
try语句块用来指定可能发生异常的程序块,配合使用的catch语句块用来处理try语句块抛出的异常。
try语句块内部如果出现异常,那么程序将跳过try语句块中出现的异常语句之后的其它代码,直接进入catch语句块内执行代码
【例】

try-catch 语句块可以嵌套使用。当try语句块遇到异常时,Java会检查与try异常程序块相配合的catch捕获处理中是否存在能处理该异常的catch语句块。如果存在,则该异常将被改catch语句块捕获并处理,否则,该异常将被上一级的try-catch语句块捕获。
【例】
package example;public class TrynestdealException {public static void main(String[] args) {tryCatch(); //调用静态try-catch函数}//静态tryCatch()函数static void tryCatch() {try { //外层try块try { //内层try块System.out.println("执行里层try块\n");int inte = Integer.parseInt("pencil");//字符串转化为整数System.out.println(inte);//输出整数}catch(ArrayIndexOutOfBoundsException e) { //捕获异常System.out.println("执行里层catch块\n");System.out.println("捕获ArrayIndexOutOfBoundsException异常" + e.getMessage());}catch(ArithmeticException e) { //捕获异常 ArithmeticException//捕获异常后输出异常信息System.out.println("执行里层catch2块\n");System.out.println("捕获ArithmeticException异常" + e.getMessage());}}catch(ClassCastException ie) { //捕获异常ClassCastExceptionSystem.out.println("捕获外层异常ClassCastException" + ie.getMessage());}catch(NumberFormatException ie) {System.out.println("捕获外层异常NumberFormatException" + ie.getMessage());}}}

4.2 必须执行语句块
有时候我们要去某地,有多条交通路线,其中有一条是必须走的,也就是通常所说的交通要道。在try-catch-finally结构中,finally语句块就是交通要道。
在try-catch语句块中定义了finally语句块。这时无论try-catch语句块是否抛出和捕获异常,程序都将执行finally语句块。
【例】
package example;public class ExceptionFinally {public static void main(String[] args) {int num[] = new int[5];try {for(int i = 0;i<5;i++) {num[i]= i+1;for(int j = 0;i<=i;j++) {num[i]+= num[j];}}for(int i = 0;i<6;i++) {System.out.println(num[i]);}}catch(Exception e){e.printStackTrace();}finally {System.out.println("finally块是必经之路");}}}

在操作文件的时候,无论操作是否成功,必须要在程序运行后关闭文件。同样,如果将释放内存的工作放到finally语句块内,那么程序不会由于未释放资源而导致内存泄漏
4.3 必须执行语句块的意外
finally语句块通常情况下总是会被执行,但在下面这几种情况下finally语句块不会被执行
- 电脑断电关机
- 在finally语句块之前的语句中含有SYSTEM.EXIT(0)语句
- 在finally语句块执行过程中抛出异常
- 程序所属线程死亡,程序在未执行finally语句块之前就退出

5.异常抛出
异常捕获语句块都存在于产生异常的方法中,异常抛出可以将产生的异常抛给调用它的方法。
如果某方法的try语句块中抛出的异常没有与之匹配的catch块,或者catch语句块已经不活了异常但不想立即处理,就可以将异常抛给调用它的上一级方法。
5.1 异常抛出的概念
- 在方法声明的时候,必须指定方法中可能产生的异常,使这个方法的调用者必须处理这些可能的异常。调用者可以自己处理这种异常,也可以将这种异常派送给它的调用者,因此异常可以逐级上溯。直到找到可以处理他的代码为止。
- 抛出异常必须做的两部分工作是在方法的声明中使用throws语句指定它所抛出的异常和使用throw语句抛出异常。
- 在方法中声明可能出现的异常是为了告诉编译器该方法可能产生的异常,因而要求该方法的使用者必须考虑处理方法抛出的异常,以增强程序的健壮性。
- 任何有异常抛出的方法都有可能导致程序的崩溃,如果使用者没有对方法抛出的异常进行处理,则会导致程序运行结束。
- 通过throw可语句可以明确的抛出一个异常,而在方法中使用throws声明次方法将抛出某种类型的异常。
5.2 throw
使用throw语句时必须声明一个异常对象,这个对象时Throwable派生类的对象
ThrowableInstance一定是Throwable类或Throwable子类的一个对象。简单类型(int、char)以及非Throwable类(String或Object)不能用作异常
【例】
package example;public class UseThrowExample {static void demoproc(String v1) {try {if(v1 == null) {//抛出NullPointerException异常throw new NullPointerException("Throw Example");}}catch(NullPointerException e){System.out.println("输入的参数为空");throw e;}}public static void main(String[] args) {try {String string = null;demoproc(string); //调用方法}catch(NullPointerException e) {System.out.println("异常情况为"+ e);}}}

5.3 throws
如果一个方法可以导致一个异常但不处理它,那么他必须在方法声明时包含一个throws子句,以使方法的调用者库保护他们自己而不发生异常。
throws子句列举了一个方法可能引发的所有异常类型,一个方法引发的所有其他类型的异常必须在throws子句中生明。如果不这样做,会导致编译错误。
package example;import java.io.IOException;public class ThrowsUsingExample {public static void main(String[] args) {try {System.out.println("请输入字符");String s = getInput();System.out.println("输入字符为:");System.out.println(s);}catch(IOException e) {System.out.println("产生异常"+e.getMessage());}}private static String getInput() throws IOException{char[] buffer = new char[10];int count = 0;boolean flag = true;while(flag) {buffer[count] = (char)System.in.read();if(buffer[count]=='\n') {flag = false;}else {count++;}if(count >=10) {IOException aException = new IOException("buffer is null");throw aException;}}return new String(buffer);}}

5.4 抛出异常的步骤
我们在使用手机软件时,经常会遇到出现异常、卡顿或者异常退出的情况,这主要和开发软件异常处理或者手机内存不足等情况有关。程序抛出异常,一般分为以下三个步骤:
- 确异常类
- 创建异常类的实例
- 抛出异常
package example;import java.sql.SQLException;public class ExceptionThreestep {//可能会抛出异常的方法public static void throwException() throws SQLException{try {throw new SQLException("SQLException1");}catch(SQLException e) {System.out.println("throwException:()抛出异常"+e.getMessage());//捕获异常暂不处理,抛出异常throw new SQLException("SQLException1");//抛出异常SQLException}}public static void main(String[] args) {try {throwException();}catch(SQLException e) {System.out.println("main()捕获SQLException:"+e.getMessage());}}}

6.自定义异常
除了Java中提供的一些异常类,还可以根据自己的需求定义异常类。
6.1 创建用户自定义异常
package example;class UserOwnException {//声明UserOwnException无参数构造方法public UserOwnException() {}//声明UserOwnException带有String类型参数的构造方法public UserOwnException(String smg) {super();//调用父类的构造方法}}public class UsingUserException {public static void main(String[] args) {try {execute(); //调用execute()方法}catch(UserOwnException e) {System.out.println(e.getMessage());}}static void execute() throws UserOwnException{try {throw new Exception();//抛出异常}//捕获Exception类catch(Exception e) {//捕获后,直接抛出用户自定义异常类throw new UserOwnException("自定义异常抛出"+e.getMessage());}}}
6.2 捕获运行时异常
创建自己的异常类,可以方便的处理和捕获某些运行时的异常,并重新抛出一个新的异常提供给它的调用者捕获。
运行时异常属于未检查异常,如果在方法的throws子句中声明了此异常,那么方法的调用者就可以不处理此异常。
package example;class MyArithException extends Exception{MyArithException(){}MyArithException(String msg){super(msg); //调用父类的构造方法}
}public class CatchRunException {public static void main(String[] args) {try {executeRuntime(); //调用executeRuntime()方法}catch(MyArithException e){System.out.println("捕获运行时异常"+e.getMessage());}}static void executeRuntime() throws MyArithException{try {int i = 1/0; //抛出运行时异常 ArithmeticException}catch(ArithmeticException e) { //捕获异常ArithmeticException/** 在这里捕获运行时异常ArithmeticException 不处理,* 而是抛出一个新的MyArithException 异常* 因为运行时异常不在方法声明的throws子句中声明* * */throw new MyArithException(e.getMessage());}}}

7.拓展训练
7.1 训练一:强制类型转换异常
【拓展要点:ClassCastException异常】
当程序运行时,有时需要对不同的类型进行类型转换。在进行类型转换的过程中,当java虚拟机发现这两个类型不兼容而无法完成转换时,就会出现ClassCastException异常
7.2 训练二:找不到类型时的异常
【拓展要点:ClassNotFoundException异常】
当应用试图根据字符串形式的类名构造类,而在遍历CLASSPATH之后做不到对应名称的.class文件时,将抛出ClassNotFoundException异常。
8.技术解惑
8.1 如何优雅地处理异常
异常是一种强大的调试手段,是因为回答了以下三个问题:
- 为什么出了错 -------- 异常类型回答了“什么”被抛出
- 在哪里出了错 ------- 异常堆栈回答了“在哪里”被抛出
- 为什么出错 ------- 异常信息回答了“为什么”被抛出
三个原则可以帮助我们在调试过程中最大限度的使用好异常:
-具体明确 - 提早抛出 -延迟捕获
8.2 throw与throws的区别
(1)throw表示语句抛出一个异常。
一般用于程序出现某种逻辑时,程序员主动抛出某种特定类型的异常。
(2)throws是方法可能抛出异常的声明(在声明方法时,表示该方法可能要抛出异常)
当某个方法可能会抛出某种异常时,用throws声明可能抛出的异常,然后交给上层调用它的方法程序处理。
throw与throws关键字的比较
- throws 出现在函数头部,throws出现在函数体中
- throws表示出现异常的一种可能性,并不一定会发生异常;而throw表示抛出异常,执行throw一定会抛出某种异常对象
- 两者都是消极处理异常的方式,而是抛出或者可能抛出异常。但是不会由函数去处理异常,而是由函数的上层调用进行处理
相关文章:
【Java学习笔记】异常处理
生活中我们在使用一些产品的时候,经常会碰到一些异常情况。例如,使用ATM机取钱的时,机器会突然出现故障导致无法完成正常的取钱业务,甚至吞卡;在乘坐地铁时,地铁出现异常无法按时启动和运行;使用…...
Ubuntu20.04环境下Baxter机器人开发环境搭建
Ubuntu20.04环境下Baxter机器人开发环境搭建 ubuntu20.04安装 略 安装ROS 略 Baxter机器人依赖安装 主目录创建工作空间,按以下步骤执行 mkdir -p ~/baxter_ws/src source /opt/ros/noetic/setup.bash cd ~/baxter_ws catkin_make catkin_make install s…...
nccl 03 记 回顾:从下载,编译到调试 nccl-test
1, 下载与编译 1.1 源码下载 $ git clone https://github.com/NVIDIA/nccl.git 1.2 编译 1.2.1 一般编译: $ make -j src.build 1.2.2 特定架构gpu 编译 $ make -j src.build NVCC_GENCODE"-gencodearchcompute_80,codesm_80" A10…...
关于车规级功率器件热可靠性测试的分享
随着中国电动汽车市场的稳步快速发展和各大车企布局新能源的扩散,推动了车规级功率器件的快速增长。新能源汽车行业和消费电子都会用到半导体芯片,但车规级芯片对外部环境要求很高,涉及到的一致性和可靠性均要大于工业级产品要求,…...
内核学习——1、list_head
双向循环链表:list_head 头节点head是不使用的: struct list_head { struct list_head *next, *prev; }; 结构体中没有数据域,所以一般把list_head嵌入到其他结构中使用 struct file_node { char c; struct list_head node; }; 此时ÿ…...
JavaEE初阶--网络基本概念
目录 一、引言 二、网络基本概念 2.1 局域网LAN 2.2 广域网WAN 三、网络通信的基础 3.1 IP地址 3.2 端口号 3.3 协议 3.4 五元组 3.5 协议分层 3.6 OSI七层模型 3.7 TCP/IP五层模型 四、总结 一、引言 本篇博客将进入网络编程以及网络原理的学习,但网…...
gitlab-cicd-k8s
k8s已经准备好 kubectl get node 创建cicdYaml文件 kubectl create namespace gitlab-cicd --dry-runclient --outputyaml >> gitlab-cicd.yaml kubectl apply -f gitlab-cicd.yaml 服务器和仓库在一起可用专有地址 使用 GitLab Runner 可以自动执行 GitLab CI/CD 管道…...
盘点下常见 HDFS JournalNode 异常的问题原因和修复方法
盘点下常见 HDFS JournalNode 异常的问题原因和修复方法 最近在多个客户现场以及公司内部环境,都遇到了因为 JournalNode 异常导致 HDFS 服务不可用的问题,在此总结下相关知识。 1 HDFS HA 高可用和 JournalNode 概述 HDFS namenode 有 SPOF 单点故障…...
深入了解python生成器(generator)
生成器 生成器是 Python 中一种特殊类型的迭代器。生成器允许你定义一个函数来动态产生值,而不是一次性生成所有值并将它们存储在内存中。生成器使用 yield 关键字来逐个返回值。每次调用生成器函数时,函数会在 yield 语句暂停,并记住当前的…...
【Linux】Xshell和Xftp简介_安装_VMware虚拟机使用
1、简介 Xshell简介 Xshell是一款强大的安全终端模拟软件支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。该软件通过互联网实现到远程主机的安全连接,并通过其创新性的设计和特色帮助用户在复杂的网络环境中高效工作。Xshell可以在Windows界面下访问远端不…...
【轮询负载均衡规则算法设计题】
一、题目描述 给定n台主机(编号1~n)和某批数据包,数据包格式为(抵达主机时刻,负载量)。这里数据每个时刻最多只有1条数据到达。负载量表示该主机处理此数据包总耗时。请计算轮询负载均衡规则下,…...
张一鸣的产品哲学:与巨头共舞,低调中寻求突破
一、引言 在当今互联网竞争激烈的格局下,与巨头企业打交道是每个新兴科技企业都需面对的挑战。字节跳动创始人张一鸣在多次访谈中分享了他与巨头企业打交道的经验:保持低调、补齐技术、产品和市场各方面的能力。本文将探讨这一策略背后的产品哲学&#…...
【面试干货】throw 和 throws 的区别
【面试干货】throw 和 throws 的区别 1、throw1.1 示例 2、throws2.1 示例 3、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java中,throw和throws都与异常处理紧密相关,但它们在使用和含义上有明显的区别。…...
安卓手机删除的照片怎么恢复?3个方法,小技巧大作用
你是否曾经不小心删除了手机里的珍贵照片,却不知道怎么恢复?别担心,今天我们就来分享几个简单的小技巧,帮助你轻松找回那些丢失的照片。这些技巧虽然简单,但却能发挥大作用,让你不再为丢失照片而烦恼。手机…...
Unity制作背包的格子
1.新建一个面板 2.点击面板并添加这个组件 3.点击UI创建一个原始图像,这样我们就会发现图像出现在了面板的左上角。 4.多复制几个并改变 Grid Layout Group的参数就可以实现下面的效果了...
道可云元宇宙每日资讯|厦门:运用元宇宙技术助力直播电商发展
道可云元宇宙每日简报(2024年6月20日)讯,今日元宇宙新鲜事有: 厦门:运用元宇宙技术助力直播电商发展 近日,厦门市商务局印发《厦门市促进直播电商高质量发展若干措施(2024年-2026年࿰…...
电脑怎么卸载软件?多个方法合集(2024年新版)
在电脑的日常使用中,我们经常需要安装各种软件来满足不同的需求,但随着时间的推移,可能会出现一些软件不再需要或需要更换的情况。此时,及时从电脑上卸载这些不必要的软件是非常重要的。它不仅可以释放硬盘空间,还可以…...
【深度学习基础】详解Pytorch搭建CNN卷积神经网络LeNet-5实现手写数字识别
目录 写在开头 一、CNN的原理 1. 概述 2. 卷积层 内参数(卷积核本身) 外参数(填充和步幅) 输入与输出的尺寸关系 3. 多通道问题 多通道输入 多通道输出 4. 池化层 平均汇聚 最大值汇聚 二、手写数字识别 1. 任务…...
面试技巧:正确回答JavaScript中Map和Object的选择问题
在JavaScript的面试中,对于何时使用Map和Object的选择问题,是一个常见的考察点。这两个数据结构都能存储键值对,但它们各有优势和适用场景。本文将深入探讨两者的区别,并通过实际代码示例来指导您如何选择。 基本概念 Map&#…...
sd StableDiffusion库学习笔记
目录 DeepSpeed realesrgan BasicSR超分辨率,去噪,去模糊,去 JPEG 压缩噪声 segment_anything mmengine controlnet_aux accelerate transfersformer pytorch_fid einops compel transfersformer 文本嵌入调整库 报错:…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
