news 2026/4/16 15:39:08

java异常处理,零基础入门到精通,收藏这篇就够了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java异常处理,零基础入门到精通,收藏这篇就够了

目录

一. 异常概述、体系

什么是异常?

为什么要学习异常?

如何处理异常?

假设我们有一个接收String参数的方法,方法中会对该参数进行一些逻辑处理,正常的业务流程要求不允许null值出现,可如果调用者传递了一个null值进来,此时我们该怎么做呢?

二. 常见运行时异常

三. 常见编译时异常

java.util.concurrent.BrokenBarrierException {CyclicBarrier.await()}

java.util.concurrent.ExecutionException

NoSuchMethodException{反射}

四. 异常的默认处理流程

五. 编译时异常的处理机制

​编辑

六.Throwable类常用方法有哪些?try-catch-finally如何使用?

String getMessage(): 返回异常发生时的简要描述

String toString(): 返回异常发生时的详细信息

void printStackTrace(): 在控制台上打印 Throwable 对象封装的异常信息

try-catch-finally 如何使用?

finally 中的代码一定会执行吗?

如何使用 try-with-resources 代替try-catch-finally?

throw和throws的区别:

七. 运行时异常的处理机制

七. 异常处理使代码更稳健的案例

八. 自定义异常

补充:

1. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

2. try-catch-finally 中哪个部分可以省略?

3. 主线程可以捕获到子线程的异常吗?

4. final、finally、finalize 有什么区别?


一. 异常概述、体系

什么是异常?
  • 异常是程序在“编译”或者“执行”的过程中可能出现的错误 / 问题,而不是语法问题导致的编译错误,语法错误不算在异常体系中,语法错误是自己的水平问题引起的。
  • 比如:数组索引越界异常、空指针异常、日期格式化异常,等…
为什么要学习异常?
  • 异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止。
  • 学习异常不是让我们以后不出异常,而是程序出了异常之后,该如何处理。体现的是程序的安全,健壮性。
  • Error:错误Error是一种特殊的类(java.lang.Error)与普通的Exception异常类不同,Error是程序无法处理的错误,Error类及其子类是指我们程序处理不了或者说不该由程序处理的错误,这类错误往往代表JVM在运行过程中出了问题,Error不应该由应用程序捕获和处理,而是由虚拟机自己处理,通常代表着虚拟机和系统级别的问题。
  • 一些常见的Error比如:
  1. Virtual MachineError:Java 虚拟机运行错误 =>内存溢出(OutOfMemoryError — 堆内存溢出StackOverflowError — 栈内存溢出)
  2. **java.lang.NoClassDefFoundError:**当虚拟机无法找到(找不到)要加载的类时抛出的错误。
  3. **LinkageError:**当类加载过程出现链接错误时抛出的错误。

Java 异常类层次结构图

异常继承关系图

  • Java中的所有异常都来⾃顶级⽗类Throwable,Throwable下有两个⼦类Exception和Error。
  • Throwable类,是所有异常类的根类,Java异常的顶层父类,所有的异常类都是由它继承。
  • Exception:异常,程序本身可以处理的异常。
  • Java中异常继承的根类是:ThrowableThrowable是根类,不是异常类。
  • Exception才是异常类,当程序出现Exception时,是可以靠程序⾃⼰来解决的,它才是开发中代码在编译或者执行的过程中可能出现的错误,它是需要提前处理的,以便程序更健壮!
  • 异常体系的最上层父类是Exception。
  • Exception的⼦类通常⼜可以分为RuntimeException和⾮RuntimeException两类
  • 异常分为两类:编译时异常(受检异常,必须处理)、运行时异常(非受检异常)。
  • 受检异常:就是程序必须手动处理的异常,如果不手动处理,则会编译失败。
  • 非受检异常:不强制程序处理的异常,不强制你手动处理,无需try…catch…,也无需throws,代码也能编译成功。
  • Error也属于非受检异常。
  • 编译时异常{受检异常-Checked Exception}:没有继承RuntimeException的异常,直接继承于Exception。编译阶段就会错误提示 / 报错,**必须要手动处理(如果受检查异常没有catch或者throws关键字处理的话,就没办法通过编译),否则代码报错不通过。编译时异常是为了提醒程序员,**比如:IOException、ClassNotFoundException、ParseException、SQLException、java.io.FileNotFoundException
  • 运行时异常{非受检异常-Unchecked Exception}:继承了RuntimeExceptionRuntimeException本身和子类。编译阶段不会报错 / 出现异常提醒,运行时出现的异常。运行时异常是代码出错而导致程序出现的问题。

package com.gch.d3_exception; /** 目标:异常的概念和体系。 */ public class ExceptionDemo { public static void main(String[] args) { int[] arr = {10, 20, 40}; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]); // ArrayIndexOutOfBoundsException System.out.println("-----------程序截止---------"); } }

package com.gch.d3_exception; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ExceptionDemo1 { public static void main(String[] args) throws ParseException { // 编译时异常(在编译阶段,必须要手动处理,否则代码报错) String time = "2030年1月1日"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); Date date = sdf.parse(time); System.out.println(date); // Tue Jan 01 00:00:00 CST 2030 // 运行时报错(在编译阶段是不需要处理的,是代码运行时出现的异常) int[] arr = {1, 2, 3, 4, 5}; System.out.println(arr[10]); // ArrayIndexOutOfBoundsException } }
如何处理异常?

在Java中有两个处理异常的方式,一个是try…catch…,一个是throws。

try…catch:

  • try…catch{捕获异常}:将可能发生异常的代码放到try代码块中,然后使用catch来捕获对应的异常。
  • 如果try代码块正常执行,那catch就不会生效如果发生了指定的异常,则会执行对应的catch代码块,然后继续往下执行,如此一来,我们就能避免异常影响到我们的正常逻辑。
  • 捕获异常时还可以接上finally代码块,无论有没有发生异常,finally代码块都会执行。

try代码块不能单独使用,应当搭配catch或finally代码块

package com.gch.exceptiondemo; import java.io.IOException; /** try捕获异常,catch处理异常 */ public class ExceptionDemo { public static void main(String[] args) throws Exception { // 可以catch一个也可以catch多个异常 try{ // 可能会发生异常的逻辑 throw new Exception(); }catch(IOException e){ // 发生IOException时,执行此代码块 System.out.println(e); }catch(ClassNotFoundException e){ // 发生ClassNotFoundException,执行此代码块 System.out.println(e); }catch(Exception e){ // 发生其它异常时,执行此代码块 // 父类异常应放在子类异常后面,否则子类不会被捕获 }finally{ // 无论是否发生异常,都会执行 // 如果没有加catch处理异常,finally虽会执行,但异常还是会影响正常逻辑 } } }

throws{抛出异常}:在方法上使用throws关键字可以声明该方法可能会抛出的异常。

  • 当我们调用一个方法时,如果这个方法用throws关键字声明了受检异常,此时我们就必须得手动处理它声明的异常,否则就会编译失败{要么你就try…catch…,要么你就在当前方法使用throws声明同样的或其父类异常}。
package com.gch.exceptiondemo; import java.io.IOException; /** try捕获异常,catch处理异常 */ public class ExceptionDemo { public static void main(String[] args) throws Exception { // 可以catch一个也可以catch多个异常 try{ // 可能会发生异常的逻辑 throw new Exception(); }catch(IOException e){ // 发生IOException时,执行此代码块 System.out.println(e); }catch(ClassNotFoundException e){ // 发生ClassNotFoundException,执行此代码块 System.out.println(e); }catch(Exception e){ // 发生其它异常时,执行此代码块 // 父类异常应放在子类异常后面,否则子类不会被捕获 }finally{ // 无论是否发生异常,都会执行 // 如果没有加catch处理异常,finally虽会执行,但异常还是会影响正常逻辑 } } /** 可以throws声明一个或多个异常 */ /** * 可以throws声明一个或多个异常 * @throws IOException * @throws ClassNotFoundException */ public static void process() throws IOException,ClassNotFoundException{ // 可能会发生异常的逻辑 } public static void f1() { // 编译失败,编译器直接报错,因为没有手动处理受检异常{try...catch... / throws} process(); } public static void f2() { // 编译成功,因为try...catch处理异常了 // try { // process(); // } catch (IOException e) { // throw new RuntimeException(e); // } catch (ClassNotFoundException e) { // throw new RuntimeException(e); // } try{ process(); }catch(IOException | ClassNotFoundException e){ // ... } } public static void f3() throws IOException, ClassNotFoundException { // 编译成功,因为throws往外抛异常了 process(); } public static void f4(){ // 因为方法f2()已经try...catch...处理异常了,所以不用再手动处理了 f2(); } }
  • 这里其实就可以体现出throws的作用了:那就是我不想处理这个异常时,我可以把这个问题往外抛,谁调用我谁就来处理,就好像在工作中出现了一个问题,你可以选择将这个问题自行解决,也可以选择将这个问题丢给你的上级解决,那你的上级碰到问题时,也会面临同样的选择,要么他自己解决,那么他就将问题抛给更上级。
  • 如果一个问题或者说一个异常发生了后就一直往上抛,到最顶层的main方法了,都没人去try…catch…解决,那程序就会终止运行。

什么时候该try…catch…,什么时候该throws呢?

  • 有一个很简单的原则就是:当前方法需要继续运行下去,就肯定得用try…catch…当前方法不需要继续运行,就可以选择throws。
  • 建议尽量选择捕获异常。

假设我们有一个接收String参数的方法,方法中会对该参数进行一些逻辑处理,正常的业务流程要求不允许null值出现,可如果调用者传递了一个null值进来,此时我们该怎么做呢?
  • 第一种做法就是给参数设置一个默认值,然后继续执行后续逻辑:
/** * @param arg 参数不允许为null */ public static void method(String arg){ if(arg == null){ arg = "默认值"; } // 继续执行业务逻辑... }
  • 第二种做法就是直接结束方法,不执行后面逻辑。{这里还可以返回不同的值,来表达方法执行的结果}
/** * @param arg 参数不能为null * @return 参数如果为null则返回false,否则为true */ public static boolean method(String arg) { if(arg == null){ return false; } // 业务逻辑... return true; }
  • 第三种做法就是抛出异常
/** * @param arg 参数不能为null */ public static void method3(String arg) { if(arg == null){ throw new RuntimeException(); } // 业务逻辑... }

总结: 如果碰到了会影响正常逻辑的情况,基本就这三大类处理方式 =>

二. 常见运行时异常

运行时异常的概念:继承自RuntimeException的异常或者其子类,
编译阶段是不会出错的,它是在运行时阶段可能出现的错误,
运行时异常编译阶段可以处理也可以不处理,代码编译都能通过!!

  1. 数组索引越界异常: ArrayIndexOutOfBoundsException。

  2. 空指针异常 : NullPointerException。直接输出没有问题。但是调用空指针的变量的功能就会报错!!

  3. 类型转换异常:ClassCastException。

  4. 迭代器遍历没有此元素异常:NoSuchElementException。

  5. 算术异常:ArithmeticException。

  6. 数字转换异常:NumberFormatException(字符串转换为数字格式错误,IllegalArgumentException的子类)。

  7. 非法线程状态异常:llegalThreadStateException

  8. 并发修改异常:java.util.ConcurrentModificationException(多线程下集合操作元素)

  9. IllegalArgumentException:参数错误(比如方法入参类型错误)

  10. SecurityException:安全错误(比如权限不够)

  11. UnsupportedOperationException:不支持的操作错误(比如重复创建同一用户)

  12. ArrayStoreException:数据存储异常(操作数组时类型不一致)

  13. java.lang.IllegalStateException{Queue full依然add()添加元素}

  14. FileSizeLimitExceededException:在SpringBoot中,文件上传时默认单个文件最大大小为1M,当上传一个较大的文件(超出1M)时,运行和后端程序报错

  15. NoSuchBeanDefinitionException:表示在应用程序中没有找到指定的Bean的定义!在Spring容器ApplicationContext中调用getBean()获取bean对象时,bean的名称填错,就会报改错,或者就跟着没有该Bean对象!

  16. UnsupportedClassVersionError:比如在JDK8上面运行JDK11环境下的程序!

  17. java.lang.UnsupportedOperationException异常:使用Collections.unmodifiableCollection(Collection c)方法来创建一个只读集合,这样改变集合的任何操作都会抛出该异常~!

package com.gch.d4_exception_runtimeException; /** 拓展: 常见的运行时异常。(面试题) 运行时异常的概念: 继承自RuntimeException的异常或者其子类, 编译阶段是不会出错的,它是在运行时阶段可能出现的错误, 运行时异常编译阶段可以处理也可以不处理,代码编译都能通过!! 1.数组索引越界异常: ArrayIndexOutOfBoundsException。 2.空指针异常 : NullPointerException。 直接输出没有问题。但是调用空指针的变量的功能就会报错!! 3.类型转换异常:ClassCastException。 4.迭代器遍历没有此元素异常:NoSuchElementException。 5.算术异常:ArithmeticException。 6.数字转换异常:NumberFormatException。 小结: 运行时异常继承了RuntimeException ,编译阶段不报错,运行时才可能会出现错误! */ public class ExceptionDemo { public static void main(String[] args) { System.out.println("程序开始。。。。。。"); /** 1.数组索引越界异常: ArrayIndexOutOfBoundsException。*/ int[] arr = {1, 2, 3}; System.out.println(arr[2]); // System.out.println(arr[3]); // 运行出错,程序终止 /** 2.空指针异常 : NullPointerException。直接输出没有问题。但是调用空指针的变量的功能就会报错!! */ String name = null; System.out.println(name); // null // System.out.println(name.length()); // 运行出错,程序终止 /** 3.类型转换异常:ClassCastException。 */ Object o = 23; // String s = (String) o; // 运行出错,程序终止 /** 5.数学操作 / 算术异常:ArithmeticException。 */ //int c = 10 / 0; /** 6.数字转换异常: NumberFormatException。 */ //String number = "23"; String number = "23aabbc"; Integer it = Integer.valueOf(number); // 运行出错,程序终止 System.out.println(it + 1); System.out.println("程序结束。。。。。"); } }

三. 常见编译时异常

当调用一个抛出异常的方法的时候,调用者必须处理这个异常(try…catch…或者throws),如果不处理,编译失败!

  1. IOException

  2. ClassNotFoundException

  3. ParseException

  4. SQLException

  5. FileNotFoundException

  6. java.lang.InterruptedException

  7. CloneNotSupportedException、

  8. java.util.concurrent.ExecutionException

  9. java.util.concurrent.TimeoutException

  10. **java.util.concurrent.**BrokenBarrierException {CyclicBarrier.await()}
  11. java.util.concurrent.ExecutionException
  12. NoSuchMethodException{反射}
  13. ServletException

package com.gch.d5_exception_javac; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** 目标:常见的编译时异常认识。 编译时异常:继承自Exception的异常或者其子类,没有继承RuntimeException "编译时异常是编译阶段就会报错", 必须程序员编译阶段就处理的。否则代码编译就报错!! 编译时异常的作用是什么: 是担心程序员的技术不行,在编译阶段就爆出一个错误, 目的在于提醒! 提醒程序员这里很可能出错,请检查并注意不要出bug。 编译时异常是可遇不可求。遇到了就遇到了呗。 了解: */ public class ExceptionDemo { // 解析异常 public static void main(String[] args) throws ParseException { String date = "2015-01-12 10:23:21"; // 创建一个简单日期格式化类: SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 解析字符串时间成为日期对象 Date d = sdf.parse(date); System.out.println(d); // Mon Jan 12 10:23:21 CST 2015 } }

四. 异常的默认处理流程

五. 编译时异常的处理机制

六.Throwable类常用方法有哪些?try-catch-finally如何使用?

Throwable类常用方法:

try-catch-finally 如何使用?

注意:不要在 finally 语句块中使用 return!

jvm 官方文档open in new windowhttps://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5JVM官方文档中有明确提到:

代码示例:

public static void main(String[] args) { System.out.println(f(2)); } public static int f(int value) { try { return value * value; } finally { if (value == 2) { return 0; } } }

finally 中的代码一定会执行吗?
try { System.out.println("Try to do something"); throw new RuntimeException("RuntimeException"); } catch (Exception e) { System.out.println("Catch Exception -> " + e.getMessage()); // 终止当前正在运行的Java虚拟机 System.exit(1); } finally { System.out.println("Finally"); }

另外,在以下几种特殊情况下,finally块的代码也不会被执行:

如何使用try-with-resources代替try-catch-finally
  1. 适用范围(资源的定义):任何实现java.lang.AutoCloseable或者java.io.Closeable接口的类对象才能定义为资源。
  2. 关闭资源:try(定义资源{流}对象:资源1;资源2)=>用完会自动调用资源对象的close方法关闭资源,即使出现异常也会做关闭操作,无需再在finally代码块中手动调用资源的close方法进行资源的关闭。
throw和throws的区别:

thow

throws

注意:如果main方法里面单独开启了一条线程,并且调用了抛出异常的方法,则只能在方法内部进行try…catch处理,因为方法内部不能使用throws抛出异常类!

七. 运行时异常的处理机制

七. 异常处理使代码更稳健的案例

package com.gch.d8_handle_runtime; import java.sql.SQLOutput; import java.util.Scanner; /** 需求:需要输入一个合法的价格为止 要求价格大于0 */ public class Test2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ try { System.out.println("请您输入价格:"); String priceStr = sc.nextLine(); // 转换成Double类型的价格 double price = Double.valueOf(priceStr); // 判断价格是否大于0 if(price > 0){ System.out.println("定价:" + price); break; }else{ System.out.println("价格必须是正数~~~"); } } catch (NumberFormatException e) { System.out.println("程序有误!"); // throw new RuntimeException(e); } } } }

八. 自定义异常

Java标准库中提供了非常多表的异常类型,用来表达各种异常情况,然而在真实开发中,这些异常并不能完全满足我们的需求,因为标准库的异常往往表达的是技术层面,而不是业务层面,像账号密码错误这种情况,用标准库的异常就不太合适,所以在开发中我们会自定义异常类型,来表达符合我们业务的异常情况。

只要继承异常类,就可以定义我们自己的异常,强烈建议大家继承RuntimeException,在自定义异常时,应当照着父类学习,提供多个构造方法,因为这样就能传递错误信息和堆栈信息。

自定义异常

异常定义好后,我们就可以new出异常对象,并用throw关键字来主动抛出异常。

补充:

1. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
2. try-catch-finally 中哪个部分可以省略?
3. 主线程可以捕获到子线程的异常吗?
4. final、finally、finalize 有什么区别?

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:38:26

在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留

在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留大小,以适配不同业务场景(如是否需要保留数据)并最大化降低功耗,下面结合硬件特性和可落地的代码,从「原理→核心函数→分场景实现→验…

作者头像 李华
网站建设 2026/4/16 11:14:50

用Sambert-HifiGan解决客服语音难题:多情感TTS实战

用Sambert-HifiGan解决客服语音难题:多情感TTS实战 引言:当客服系统需要“有情绪”的声音 在智能客服、虚拟助手和自动化外呼等场景中,传统的单一语调语音合成(TTS)系统往往显得机械、冷漠,难以传递真实服务…

作者头像 李华
网站建设 2026/4/16 11:03:43

MelonLoader插件加载器完全指南:从入门到精通

MelonLoader插件加载器完全指南:从入门到精通 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 想要为你的Unity游戏注…

作者头像 李华
网站建设 2026/4/16 12:44:15

招聘季手忙脚乱?这款VIP套餐让HR效率翻倍的秘密

校招旺季、业务扩张等场景下,企业批量招聘时HR常陷入困境:多岗位发布耗时、海量简历手动邀约低效、职位易沉底需反复刷新。招聘需求大的企业HR更是感慨,大多精力都耗费在招聘琐事上。批量招聘的核心痛点是“多岗位、多候选人、高曝光”需求与…

作者头像 李华
网站建设 2026/4/16 11:01:31

从GitHub星标到生产环境:热门开源项目的落地挑战

从GitHub星标到生产环境:热门开源项目的落地挑战 引言:当明星项目遇见真实场景 在AI生成内容(AIGC)领域,Image-to-Video图像转视频生成器自发布以来迅速成为GitHub上的高星项目。其基于I2VGen-XL模型的架构&#xff0c…

作者头像 李华