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

Java异常处理完全指南:轻松搞定运行时与编译时异常!

Java异常处理完全指南:轻松搞定运行时与编译时异常!

📌 一、异常到底是什么?

想象一下:你正在运行一个Java程序,突然程序"崩溃"了——这通常就是异常在作祟!

// 典型的异常场景publicclassDailyExample{publicstaticvoidmain(String[]args){// 场景1:读取不存在的文件 ❌readFile("不存在的文件.txt");// 场景2:除以零 ❌calculate(10,0);// 场景3:访问空对象 ❌Stringtext=null;printLength(text);}}

异常(Exception)就是程序运行时的"意外事件",它打断了正常的指令流。Java提供了一套完善的异常处理机制,让我们能够优雅地处理这些意外。

🏗️ 二、Java异常家族树

📦 Throwable (所有异常/错误的祖宗) ├── 🔴 Error (严重错误,程序无法处理) │ ├── OutOfMemoryError (内存溢出) │ ├── StackOverflowError (栈溢出) │ └── VirtualMachineError (虚拟机错误) │ └── 🟡 Exception (异常,可以处理) ├── 🟢 RuntimeException (运行时异常) │ ├── NullPointerException (空指针) │ ├── ArrayIndexOutOfBoundsException (数组越界) │ ├── ClassCastException (类型转换错误) │ ├── IllegalArgumentException (非法参数) │ └── ArithmeticException (算术异常) │ └── 🔵 其他Exception (编译时异常) ├── IOException (IO异常) ├── SQLException (数据库异常) ├── FileNotFoundException (文件未找到) └── ClassNotFoundException (类未找到)

🔍 关键区别速记:

Error:天灾人祸,程序救不了 ❌
Exception:小病小痛,程序能自救 ✅

🆚 三、核心对决:运行时异常 vs 编译时异常

🟢 运行时异常(RuntimeException)

特点:编译器不检查,出了事才处理
别名:非受检异常(Unchecked Exception)
心态:“代码有风险,运行需谨慎”

publicclassRuntimeDemo{publicstaticvoidmain(String[]args){// 1️⃣ 空指针异常 - 最常见的异常!Stringname=null;// System.out.println(name.length()); // 运行时崩溃!// 2️⃣ 数组越界异常int[]scores={90,85,95};// System.out.println(scores[10]); // 运行时崩溃!// 3️⃣ 类型转换异常Objectobj="我是字符串";// Integer num = (Integer) obj; // 运行时崩溃!// 4️⃣ 算术异常// int result = 100 / 0; // 运行时崩溃!}}

处理建议:虽然编译器不强制,但重要逻辑一定要处理!

🔵 编译时异常(Checked Exception)

特点:编译器强制检查,不处理就编译失败
别名:受检异常
心态:“提前预防,必须处理”

importjava.io.*;publicclassCheckedDemo{// ❌ 不处理会编译报错!// public void readFile() {// FileReader reader = new FileReader("test.txt");// }// ✅ 方案1:try-catch处理publicvoidreadFileWithTryCatch(){try{FileReaderreader=newFileReader("test.txt");System.out.println("文件读取成功!");}catch(FileNotFoundExceptione){System.out.println("文件不存在,创建默认配置...");// 恢复逻辑}}// ✅ 方案2:throws声明publicvoidreadFileWithThrows()throwsIOException{FileReaderreader=newFileReader("test.txt");// 继续抛出,让调用者处理}}

🛠️ 四、异常处理四大法宝

法宝1️⃣:try-catch-finally(基础必备)

publicclassTryCatchDemo{publicvoidprocessOrder(StringorderId){Connectionconn=null;try{System.out.println("开始处理订单: "+orderId);// 1. 连接数据库conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/db");// 2. 业务处理(可能抛出异常)validateOrder(orderId);updateInventory(orderId);sendNotification(orderId);System.out.println("订单处理成功!");}catch(SQLExceptione){System.out.println("数据库操作失败: "+e.getMessage());// 记录日志,发送告警log.error("订单处理失败",e);}catch(IllegalArgumentExceptione){System.out.println("订单参数错误: "+e.getMessage());// 返回错误给用户}catch(Exceptione){System.out.println("未知错误: "+e.getMessage());// 兜底处理}finally{// 3. 无论如何都要执行!System.out.println("执行清理工作...");if(conn!=null){try{conn.close();// 释放资源}catch(SQLExceptione){System.out.println("关闭连接失败");}}}}}

法宝2️⃣:try-with-resources(优雅关闭)

// Java 7+ 自动资源管理,告别finally!publicclassModernResourceDemo{publicvoidreadConfigFile(Stringpath){// 资源自动关闭,像魔术一样!try(FileInputStreamfis=newFileInputStream(path);BufferedReaderreader=newBufferedReader(newInputStreamReader(fis))){Stringline;while((line=reader.readLine())!=null){System.out.println(line);}}catch(IOExceptione){System.out.println("配置文件读取失败: "+e.getMessage());}// 不用写finally!资源自动关闭}}

法宝3️⃣:throw(主动抛出异常)

publicclassValidator{// 参数校验 - 主动抛出异常publicvoidregisterUser(Stringusername,Stringpassword){if(username==null||username.trim().isEmpty()){thrownewIllegalArgumentException("用户名不能为空!");}if(password==null||password.length()<6){thrownewIllegalArgumentException("密码长度至少6位!");}if(username.equals("admin")){thrownewSecurityException("不能使用admin用户名!");}System.out.println("用户注册成功: "+username);}}

法宝4️⃣:throws(异常声明)

publicclassDataProcessor{// 声明可能抛出的异常publicvoidprocessUserData(StringuserId)throwsSQLException,DataFormatException{// 数据库操作可能抛出SQLExceptionUseruser=userDao.findById(userId);// 数据处理可能抛出自定义异常if(user.getData()==null){thrownewDataFormatException("用户数据格式错误");}// 业务逻辑...}}// 调用者需要处理这些异常classServiceLayer{publicvoidhandleUserRequest(StringuserId){DataProcessorprocessor=newDataProcessor();try{processor.processUserData(userId);}catch(SQLExceptione){System.out.println("数据库异常,请稍后重试");}catch(DataFormatExceptione){System.out.println("数据格式错误: "+e.getMessage());}}}

代码踢调试

main.文件

packageorg.example;publicclassMain{publicstaticvoidmain(String[]args){// System.out.println(dis(10, 0));// 铺获 之后 代码还是能 往下面执行的try{test1();// Object o = null;// o.toString();}catch(NullPointerExceptione){// e.printStackTrace(); // 打印红色的报错/** * java.lang.NullPointerException: Cannot invoke "Object.toString()" because "o" is null * at org.example.Main.main(Main.java:9) * */// System.out.println(e);// System.out.println("try 发生了异常呗铺到了");System.out.println(e.getMessage());}catch(TestRunTimeExceptione){System.out.println(e.getMessage());}System.out.println("1111111111");}privatestaticvoidtest1(){thrownewTestRunTimeException("我是自定义异常");}protectedstaticintdis(inta,intb){if(b==0){// throw new TestRunTimeException("0 不能作为除数"); // 运行时会报错thrownewRuntimeException();// RuntimeException 可以传入参数}returna/b;}}

TestException 文件

packageorg.example;// 编译时 异常publicclassTestExceptionextendsException{publicTestException(Stringmessage){super(message);}}

TestRunTimeException 文件

packageorg.example;// RuntimeException 是 继承 Exception 的子类 见md文件publicclassTestRunTimeExceptionextendsRuntimeException{publicTestRunTimeException(Stringmessage){super(message);}}

Error和Exception有什么区别?

Error是系统级错误,程序无法处理(如内存溢出);Exception是程序级异常,可以被捕获处理。

throw和throws的区别?

throw是抛出异常(动词),throws是声明异常(名词)。

http://www.jsqmd.com/news/114965/

相关文章:

  • 为什么顶尖团队都在用Open-AutoGLM做推理优化?真相令人震惊
  • 告别低效特征工程:Open-AutoGLM三大核心优势全面解析
  • vue3+springboot基于微信小程序的校园课程资料学习作业提交系统(编号:66245746)
  • 如何 为 Linux centos7 Minimal系统 配置国内镜像
  • 特征提取效率瓶颈难破?Open-AutoGLM这5个优化策略必须掌握
  • Open-AutoGLM坐标定位误差修正实战(误差降低90%的秘密)
  • 【大模型推理性能跃升关键】:Open-AutoGLM CPU资源调度的7个核心技巧
  • ChatGPT功能调整:AI人格回归与成人内容监管
  • vue3+springboot基于小程序物联网 uniapp菌菇房环境管理系统(编号:443931199)
  • Open-AutoGLM特征提取提速5倍:背后你不知道的3大关键技术
  • 2025年印刷粘箱打包联动线品牌排行:高效整合方案推荐,电脑控制高速水墨印刷开槽机印刷粘箱打包联动线批发厂家选哪家 - 品牌推荐师
  • Open-AutoGLM低延迟改造实战(仅限内部流传的4项调优秘诀)
  • 【Open-AutoGLM操作序列优化】:揭秘高效自动化生成背后的核心算法
  • Open-AutoGLM定位误差如何修正?3步实现厘米级坐标准确度
  • 错过将落后三年:Open-AutoGLM多任务调度技术全景解析
  • 2025年12月床上用品批发,结婚床上用品购买,结婚床上用品进货厂家权威推荐,婚庆家纺品质红榜发布 - 品牌鉴赏师
  • Open-AutoGLM + CUDA 12.x 适配实战(独家调优参数大公开)
  • 2025年最火技术岗来袭:大模型应用开发工程师,你准备好了吗?
  • 2025年12月全国婚庆用品批发,婚庆用品加盟,婚庆用品进货平台厂家品牌推荐榜,彰显国产服务实力 - 品牌鉴赏师
  • Open-AutoGLM压缩技术揭秘:为何它能突破内存瓶颈?
  • 【AI调度革命】:Open-AutoGLM如何重新定义多任务处理优先级模型
  • 2025年高效的线上医院问诊小程序搭建公司排行榜 - mypinpai
  • 掌握这3种方法,轻松将Open-AutoGLM内存占用降低85%!
  • 【神经网络推理新纪元】:Open-AutoGLM带来的4项颠覆性突破
  • 2025年12月床上用品,结婚床上用品购买,结婚床上用品进货厂家推荐榜,优选家纺企业实力解析 - 品牌鉴赏师
  • 【深度收藏】RAG入门到精通:最小可运行代码示例,让大模型不再“胡说八道“
  • 揭秘Open-AutoGLM语义理解瓶颈:如何实现准确率跃升至92.7%
  • 告别慢速匹配:Open-AutoGLM模式引擎优化的7个关键步骤
  • 必看!2025年高口碑场地扫地车精选推荐榜单,助你轻松应对多样化清洁需求
  • 2025年12月婚庆用品,婚庆用品一站式推荐,婚庆用品加盟厂家推荐:行业权威盘点与品质红榜发布 - 品牌鉴赏师