关于 Java 异常机制的补充

Java线程间的等待唤醒机制详解 Java提供了丰富的并发工具类来简化并行编程任务。例如Semaphore和Phaser等。这些高级工具可以提供比原始等待唤醒机制更多的控制功能,例如:- 可中断的等待;- 尝试获取锁;- 信号量控制;- 多阶段同步点。 阅读详情
为什么 Java 中打开物理资源,如磁盘文件、网络连接、数据库连接等,必须需要显式的关闭?

JVM 提供的垃圾回收机制只负责堆内存分配出来的内存,打开的物理资源,GC 是不进行回收的,所以需要手动的关闭。

如何正确的关闭资源?
  1. 在 finall 中执行资源关闭操作。
  2. 保证关闭资源前资源不为 null,因为存在资源初始化前就发生异常情况,所以在 finally 语句中对资源对象进行非空判断。
  3. 为每个资源关闭操作执行 try/catch 操作,因为在资源关闭过程中也有可能发生异常,导致程序中断。
public void test() {

        FileInputStream inputStream = null;
        FileOutputStream outputStream = null;

        try {
            inputStream = new FileInputStream("srcPath");
            outputStream = new FileOutputStream("destPath");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {//操作1
            if(inputStream != null){//操作2
                try {//操作3
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if(outputStream != null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
finally 与 return 的关系

阐述两者的关系,我们主要关注 return 关键字的位置,为了表达的更形象,看下例:

private static int test(){
        int count = 5;
        try {
            count++;
            return count;
        }finally {
            System.out.println("finally 语句执行");
            System.out.println("finally 语句执行 " + count);
            count++;
            return count;
        }
    }
    

public static void main(String[] args) {
        int  a = test();
        System.out.println(a);
    }

打印日志为:

finally 语句执行
finally 语句执行 6
7

当 Java 程序执行 try/catch 中有 return 语句,return 语句会导致方法立即结束。但是系统执行完 return 语句不会马上结束该方法,而是查看在这个异常处理的流程中是否存在 finally 语句,如果存在 finally 语句,那么需要执行 finally 语句。如果 finally 语句中有 return 语句,那么会更新 try/catch 语句 return 返回的值,但是需要注意的是因为该方法已经结束,此处的 return 不会像无法返回到 try/catch 中执行代码(因为 try/catch 之后才会来到 finally 语句)。具体可以参看上例自行揣摩其中含义。

在举一个例子,我们在 catch 中执行 return 语句:

private static int test(){
        int[] counts = new int[]{5,3};
        int count = counts[0];

        try {
            int error = counts[2];
            count++;
            return count;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("catch 语句执行" + count);
            return count;

        }finally {
            count++;
            System.out.println("finally 语句执行" + count);
            return count;
        }
    }
    

public static void main(String[] args) {
        int  a = test();
        System.out.println(a);
    }

打印日志为:

catch 语句执行5
finally 语句执行6
6

针对该例不做阐述。

关于异常的捕获

当 Java 运行时环境接收到异常对象时,系统会根据catch(TypeException e) 来决定使用哪一个异常分支来处理程序引发的异常。程序进入负责异常处理的 catch 块时,系统生成的异常对象 ex 将会被传给 cathc(TypeException ex) 的异常形参,从而可以在 catch 块中访问异常信息。

关于异常捕获的顺序

捕获父类异常的 catch 块在捕获子类异常的 catch 块后,即先处理小异常,再处理大异常。

使用异常机制的注意点
  1. 不要使用 try/catch 来控制流向。
  2. 精准捕获可能抛出的异常,不要乱抛异常,不要放大异常的范围。
  3. 不要在 finally语句中递归调用可能引起异常的方法,因为这将导致该方法的议程不能被正常抛出,甚至StackOverflowError 也不能终止程序,只能强制终止 java 进程才可以终止程序运行。
  4. 在子类复写时,子类方法只能抛出父类方法声明抛出的异常的子类。
知识链接

疯狂 Java 系列书籍

浮点数加法器设计 一.设计内容及其要求 内容 根据浮点数的运算规则和IEEE754标准,实现浮点数的加法运算器。 要求: 浮点数格式:符号位1位,阶码8位,尾数23位 要求该实验能完整的体现浮点数的运算的五个步骤:对阶、尾数求和、规格化、舍入(要求使用对偶舍入)、溢出判断。 二.基本要素 浮点数 浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。 计算机中的浮点运算的计算结果一般是不确定的,一块芯片的浮点运算 阅读详情

相关推荐

抖音无人直播技术全解析:从原理、实操到合规化思考

直播技术作为内容分发的核心形式,其底层依赖于流媒体协议(如RTMP)与实时音视频编码推流。通过OBS等软件进行场景合成与虚拟摄像头技术,可以实现丰富的画面包装与自动化播放。这项技术的核心价值在于突破人力与时间的限制,实现内容的持续输出与流量获取,在电商带货、品牌展示、陪伴式内容等场景中具有应用潜力。然而,单纯依赖录播循环存在高风险,平台风控系统会通过内容重复性检测与互动行为模型进行识别。因此,更可持续的方向是探索“半无人直播”或自动化辅助工具,例如利用AI数字人驱动或直播切片技术,在合规前提下提升运营效率。

weixin_29895109的博客 508

【vue设计与实现】响应系统的作用与实现 4-避免无限递归循环&调度执行

避免无限递归循环 看下面的例子: const data = {foo:1} const obj = new Proxy(data,{/*...*/}) effect(()=>obj.foo++) 可以看到这里有个自增操作obj.foo++,该操作会引起栈溢出: Uncaught RangeError: Maximum call stack size exceded 下面来搞清楚这个问题是为什么。 实际上,把obj.foo++这个操作分开来看,相当于: effect(()=>{ obj.fo

loyd3的博客 950

C51单片机驱动ILI9341彩屏实战:从Proteus仿真到绘制自定义图案(附完整代码)

本文详细介绍了使用C51单片机驱动ILI9341彩屏的完整实战流程。内容涵盖硬件连接、8080并行接口时序模拟、寄存器初始化、屏幕方向设置以及基本图形绘制原理,并重点讲解了如何在Proteus仿真环境中搭建电路、调试代码,最终实现自定义图案的显示。文章提供了完整的代码示例,为嵌入式开发学习者和复古硬件爱好者提供了一套可行的解决方案。

rnn9storyteller的博客 511

python中try-except-finally中使用递归的

    昨天发现try-except-finally中使用递归,结果掉进坑里了,爬了好久,好久.....     需求是这样的,我们请求三方一个接口,这个接口呢,有时候不稳定,需要重试,最大重试测试是5次,当时的代码大致是这样的。 def request_interfaces(num): print("request_interfaces num:%s" % num) rai...

果汁华的博客 1310

【Stata双重差分模型】双重差分DID的具体操作步骤

本案例将详细阐述如何使用双重差分法进行实证分析,并展示具体的STATA操作代码。

a519573917的博客 2万+

C#上位机通信层封装:西门子S7NetPlus库的优雅使用

支持S7-1200/1500(机架号0,槽号1)、S7-300/400(机架号/槽号需根据实际配置);支持位(Bit)、字节(Byte)、字(Word)、双字(DWord)、浮点数(Float/Double)等数据类型的读写;支持DB块、输入寄存器(I)、输出寄存器(Q)、内存寄存器(M)、定时器(T)、计数器(C)的操作;轻量无依赖,兼容.NET 5+。首先定义核心枚举和常量,统一规范参数类型,避免硬编码。/// 西门子PLC型号(对应不同的机架/槽号默认配置)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1085

Java之异常与对象补充

类继承Exception就是一个自定义异常类使用方法:在自定义类中定义一个想要监控的数据,然后使用toString方法打印异常,使用构造器接收数据设置限定条件,如果不符合则将异常抛给自定义类System.out.println("传递的参数为:"+a);//抛出异常try {test(11);

2301_81302603的博客 489

【FPGA教程案例59】深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

在课程,我们对的基本原理有了初步认识。在上一个课程,我们完成了CNN的Relu激活层、pool池化层、卷积层以及图像输入层的实现,如下图所示:在本课程中,我们将上述四个模块结合起来,构建一个简单的CNN卷积神经网络。...

FPGA/MATLAB学习教程/源码/项目合作开发 2637

java try-finally,java try-catch-finally递归问题

public class Foo {public static void main(String[] args) {foo();}public static void foo() {try {System.out.println("try");foo();} catch (Throwable e) {System.out.println("catch");foo();} finally {Syst...

weixin_39638188的博客 276

52、切换线性动态系统:原理、挑战与高斯和滤波解决方案

本文介绍了切换线性动态系统(SLDS)的基本原理及其在复杂时间序列建模中的应用。SLDS结合了隐马尔可夫模型的离散状态切换与线性动态系统的连续状态演化,适用于系统动态发生跳跃的场景,如化工过程监测和金融市场分析。由于精确推理在计算上不可行,文章重点阐述了高斯和滤波这一近似方法,通过有限高斯混合来逼近后验分布,并详细描述了其递归更新、权重计算与组件合并流程。同时讨论了性能评估、优化策略及常见问题的解决方案,并展望了SLDS与深度学习、在线学习和多模态融合的未来发展方向。

algae的博客 161

软考中级-软件设计师 Python基础

软考中级-软件设计师 Python知识点整理

片言可决讼,半纸能缚龙 3641

Java 异常相关(二):异常处理机制的补充,自定义异常的使用等

本文讲述 Java 异常相关知识,对异常处理机制进行补充,以及自定义异常的方式。

积累,沉淀,温故而知新 1475

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6与LPDDR5 ZQ Calibration技术探讨

zilan23的博客 1099

十一,异常的捕获与处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34106122的博客 189

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

CC00069.bigdatajava——|Java&集合类库.V05|——|Java.v05|异常机制.v50|异常抛出|补充|

一、异常抛出 ### --- 基本概念 ——> 在某些特殊情况下有些异常不能处理或者不便于处理时, ——> 就可以将该异常转移给该方法的调用者,这种方法就叫异常的抛出。 ——> 当方法执行时出现异常,则底层生成一个异常类对象抛出,此时异常代码后续的代码就不再执行。 ### --- 语法格式 ——> ...

yanqi_vip 182

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java面向对象编程补充

Java面向对象编程除了上一篇文章的编程框架以外,还有一些东西需要补充一下。 Java中的异常机制——Exception初步 在一个已编译的程序运行时,因为一些非正常现象(如除数为0、数组越界等)导致程序异常终止,此时我们就需要捕获并处理此异常,确保程序正常执行。 一、简单异常的体现 public class textEx { public static void main(String[] a...

九二六四的博客 249

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 异常处理机制专项

三是未区分业务异常与系统异常,导致非致命业务错误触发服务熔断,影响服务可用性。建立“系统异常-业务异常-第三方异常”三级分类标准,定义12种核心异常类型(如参数校验异常、数据库连接异常、支付超时异常)新增异常等级标识(INFO/WARN/ERROR/FATAL),支持日志平台按等级筛选,减少无效日志干扰。业务异常(如余额不足)仅触发局部流程终止,不影响服务整体可用性,避免“一个错误拖垮全链路”搭建异常趋势看板,实时展示各模块异常发生率、TOP3异常类型,支持回溯7天数据。发布时间:202X年XX月XX日。

Halo_tjn的博客 410

Java异常的处理--finally关键字的用法

本文补充讲解了Java异常处理中的finally关键字使用。finally通常与try-catch配合,确保特定代码块必定执行(除非JVM终止),即使在return语句前也会执行。文章展示了finally的两种语法结构,并通过代码示例验证了其执行特性:1)在异常发生后仍会执行;2)在return前优先执行。这是对前文异常处理机制的进一步完善,强调finally在资源清理等场景中的重要作用。

freed_Day的博客 571

Java 基础系列:异常

Java中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。为了能够及时有效地处理程序中的运行错误,必须使用异常类。 1.异常类型 Throwable是Java中异常的根类,它有两个子类:   Exception:是程序本身可以处理的异常。异常处理通常就是针对这种类型异常的处理。它也可以细分为两个方向:     非检查异...

weixin_30763455的博客 222

Java-异常

Java异常处理机制总结:异常是程序执行中的不正常行为,分为Error(致命错误)和Exception(可处理异常)。Exception又分为编译时异常(必须处理)和运行时异常。处理方式包括防御式编程和try-catch捕获,可通过throws声明异常或使用finally确保资源释放。Java支持自定义异常、多异常捕获(Java7+)和try-with-resources自动资源管理。合理使用异常处理能提高程序健壮性,关键要区分异常类型并选择适当处理方式。

Angus_Wb的博客 1022

Java异常处理全攻略:让你的代码更加稳定

java异常处理核心技巧,走过路过不要错过!

qq_73698057的博客 1384

java基础——异常

一、 异常 a) 现象: 输出结果和预期结果不一致 程序运行过程中爆炸 阻止运行 b) 技术: 系统级异常 Error 编译异常 Exception -> 派生类 使用一个未声明的内容 … 运行时异常 RuntimeException InputMismatchException 输入不匹配异常 ArithmeticException 算术异常 ArrayIndexOutofBoun...

weixin_42930053的博客 138

Java:异常

都是 JVM 级致命错误,

Hz10220022的博客 375

JavaEE基础(十九)/异常和File

1、异常(异常的概述和分类) A:异常的概述 异常就是Java程序在运行过程中出现的错误。 B:异常的分类 通过API查看Throwable Error 服务器宕机,数据库崩溃等 Exception C:异常的继承体系 Throwable Error Exception RuntimeException ...

weixin_30695195的博客 255

【Java】:学习笔记(易错小结)

📃这篇博客意旨大家对于 java 没有注意到的小点,给大家补充一些内容,增加 对 java 的理解。

island1314的博客 1518

Java基础JVM之自动内存管理机制

一,基础背景知识 Java编译器的输出并不是可执行的代码,而是字节码(bytecode)。字节码是一套设计用来在Java运行时系统下执行的高度优化的指令集,该Java运行时系统称为Java虚拟机(JavaVirtual Machine,JVM)。 Java程序设计语言,Java虚拟机,Java API类库这三部分统称为JDK(Java Development Kit),JDK是至此程序开发的最...

hellolianhua的博客 148
上一篇: Java 异常机制浅析
下一篇: 从缓存文件的角度帮你理解 Okhttp3 缓存原理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值