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

Java 异常②

目录

  • 文章摘要
  • 1. throw 处理异常
  • 2. throws 声明异常
  • 3. throw 和 throws 的区别
  • 4. finally
  • 5. 自定义异常类

文章摘要

本文详细讲解了Java异常处理中的三个关键机制:
throw用于主动抛出异常对象,需配合try-catch处理;throws声明方法可能抛出的异常类型,将异常传递给调用者处理;finally块确保无论是否发生异常都能执行,常用于资源释放。文章通过代码示例对比了throw和throws在作用、位置、语法等方面的区别,并介绍了自定义异常类的创建方法及其优点。

1. throw 处理异常

throw : 主动抛出一个异常对象。 语法 :throw 异常对象;

1.1 throw 示例

publicclassTest{publicstaticvoidmain(String[]args){intage=-1;if(age<0){thrownewRuntimeException("年龄不能为负数");}System.out.println("正常执行");}}



age < 0

new RuntimeException 对象

throw 抛出

程序异常结束

后面的System.out.println("正常执行");不会执行

1.2 throw 和 try-catch的结合
如果抛出的异常有人捕获:

publicclassTest{publicstaticvoidtest(int[]a){try{if(a==null){thrownewNullPointerException();}}catch(NullPointerExceptione){e.printStackTrace();}System.out.println("执行剩余代码");}publicstaticvoidmain(String[]args){int[]a=null;test(a);}}

2. throws 声明异常

声明一个方法可能会抛出的异常,把异常交给调用者处理
语法 : 修饰符 返回值 方法名(参数) throws 异常类型 { }

2.1 throws 示例

publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{readFile();}publicstaticvoidreadFile()throwsIOException{FileInputStreamfis=newFileInputStream("a.txt");}}


编译阶段:

发现FileInputStream可能IOException

检查有没有try-catchthrows

throws

编译通过

运行阶段:

执行new FileInputStream("a.txt")

发现文件不存在

真正产生IOException

程序终止

3. throw 和 throws 的区别

throwthrows
作用主动抛异常声明异常
位置方法内部方法声明处
后面跟异常对象异常类型
是否产生异常不会
数量一次一个可以多个
常用于主动检测错误传递异常责任

4. finally

无论 try 中是否发生异常,finally 中的代码通常都会执行。

语法 :

try{// 可能发生异常的代码}catch(异常类型 e){// 处理异常}finally{// 一定执行的代码}

例子 :

publicclassTest{publicstaticvoidmain(String[]args){try{inta=10/0;}catch(Exceptione){System.out.println("捕获异常");}finally{System.out.println("执行finally");}}}

final 经常用来关闭资源

publicclassTest{publicstaticintgetData(){Scannerin=null;try{in=newScanner(System.in);intdata=in.nextInt();returndata;}catch(InputMismatchExceptione){e.printStackTrace();}finally{System.out.println("关闭Scanner");in.close();}return0;}publicstaticvoidmain(String[]args){intret=getData();}}

如果输入不匹配的数据时发生异常也能关掉资源 ,可以有效减少资源泄露

5. 自定义异常类

根据业务需求,自己创建一个异常类型。

例如 : 自定义一个异常类判断年龄的有效范围

classInvalidAgeExceptionextendsRuntimeException{publicInvalidAgeException(){super();}publicInvalidAgeException(Stringmessage){super(message);}}classStudent{Stringname;intage;publicStudent(intage,Stringname){try{if(age<0||age>120){thrownewInvalidAgeException("年龄非法");}this.age=age;this.name=name;}catch(InvalidAgeExceptione){e.printStackTrace();}}}publicclassTest{publicstaticvoidmain(String[]args){Students1=newStudent(150,"pater");}}

1.super(message);: 调用父类RuntimeException的构造方法,把错误信息保存下来
2.如果想写成编译时异常 ,把extends RuntimeException改为extends Exception
3.处理异常的方式选择try-catch或者throws

自定义异常类的优点:

  • 语义清晰:异常名直接反映业务含义,比如InvalidAgeException
  • 便于维护:一看异常名就知道问题类型
  • 支持分层处理:可以针对不同异常做不同处理逻辑,提升程序灵活性
http://www.jsqmd.com/news/1311426/

相关文章:

  • 2026 年现阶段西昌评价高的商场拆除回收源头厂家格局重塑与选型新思路,开了二十年的老商场要拆了?原来旧设备还能变钱,不少人都不知道这回事-昝氏设备回收 - 鉴选官
  • 全球股王再次易主,你咋看待
  • 倒计时·DJS V2.8.3beta
  • 从电竞选手性格与团队环境看组织行为学与舆论管理
  • 天线核心参数全解析:从频率、增益到VSWR,硬件工程师选型指南
  • 移远ML302 CAT1模组实战:硬件设计、AT指令与低功耗优化指南
  • GD32移植CmBacktrace:ARM Cortex-M崩溃追踪与深度调试实战
  • C#从入门到精通:实战指南与上位机、WebAPI开发全解析
  • 如何让魔兽争霸3在2025年依然流畅运行:WarcraftHelper完整优化指南
  • Android 设备连接与边缘计算项目全景
  • 基于TB6605FTG的无刷电机驱动:I2C控制、电路设计与Arduino/ESP32实战
  • 从零部署与调优Mosquitto MQTT Broker:物联网消息中间件实战指南
  • GEO 架构实战:如何将企业非结构化文档清洗为 AI 优先推荐的语义节点?
  • 2026嘉兴注册公司机构口碑榜|主播财税与税务异常处理指南 - 行业深度分析
  • APK证书指纹提取全攻略:从原理到实践,掌握4种核心方法
  • 小院里的小商机,靠它省出半年房租
  • 入侵检测与防御系统:从核心原理到实战部署的完整指南
  • ESP32-S2-Pico物联网开发实战:从核心硬件到低功耗Wi-Fi应用
  • DLSS 5技术解析:AI超分与帧生成如何重塑游戏渲染管线
  • 终极免费指南:如何在WPS Office中安装Zotero插件实现科研写作效率飞跃
  • 桌面宠物应用开发指南:从部署到二次开发的完整实践
  • OpenClaw月度稳定版与成熟度评分卡:构建可观测、可评估的AI代理生产系统
  • 单片机毕设选题推荐:基于嵌入式技术的家用智能马桶综合控制系统实现 红外传感驱动的 STM32 智能卫浴控制装置设计(016301)
  • 高德全栈具身技术体系解析:从地图导航到世界模型的跨越
  • 用Python实现UDP简易聊天程序!先搞懂:为啥UDP不能直接做聊天软件?
  • 2026年四川耐用密目网厂家甄选参考:从资质到产能的客观分析 - 优质品牌商家
  • 硬件项目开发全流程解析:从概念验证到量产避坑指南
  • 2026年8月工业通风管道/人防通风管道厂家推荐大全_河北栩强机电设备安装有限公司 - 行业平台推荐
  • 从 PHP 到 AI + Golang,程序员自救转型手记(四十七):列表通用排序接口实现(增量重排法)
  • MiniSpring框架学习笔记-AutoProxyCreator:如何自动添加动态代理?