Java的异常处理

深入解析SAP MM模块OBYC自动科目分配机制:从T030表到实战配置 本文深入解析SAP MM模块中OBYC自动科目分配机制,阐明其作为连接物流与财务核心桥梁的作用。文章以T030表为核心,详细拆解其字段结构与检索逻辑,并通过采购收货、生产发料等实战场景,手把手演示配置步骤与关键要点,帮助读者掌握从原理到实践的完整知识体系,实现业财无缝对接。 阅读详情

Java的异常处理

基本介绍

异常对象都是派生于Throwable类的一个实例,如果我们的内置的异常类不能满足需求,我们可以自定义异常进行处理

所有的异常都是由Throwable继承而来的,在下一层分为两个部分:

  • Error类
  • Exception类

其中,Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误

而我们重点关注的是Exception层次结构。这个层次结构又分解为了两个部分:

  • RuntimeException
  • 其他异常

划分标准为:由程序错误导致的异常属于RuntimeException;而我们的程序本身没有错误,但是由于像IO错误这类问题导致的异常属于其他异常。

通常,我们的RuntimeException包含以下:

  • 错误的指令转换,数组的访问越界,访问null指针

不是派生于RuntimeException的异常包含以下:

  • 试图在文件的尾部后面读取数据,试图打开一个不存在的文件,试图根据指定的字符查找Class对象

总结:

我们将Error和RuntimeException的所有异常称为非受查异常,而将所有的其他异常称为受查异常

异常的处理机制

对于异常,我们有两种处理机制:

  • 在定义的方法上声明所有可能抛出的受查异常,而我们的非受查异常要么不可控制,要么就应该避免发生。如果方法没有声明所有可能发生的受查异常,编译器就会发出一个错误信息

  • 捕获异常

继承中关于异常需要注意的点

如果我们的子类中覆盖了父类的一个方法,那么子类中声明的异常不能比父类声明的异常更通用,就是说子类方法中可以抛出的异常范围应该小于我们的父类,或者根本不抛出异常,如果我们的父类没有抛出异常,而必须保证我们的子类也不会抛出任何的受查异常。

异常的捕获

如果我们的异常发生的时候没有在任何地方进行捕获,那么程序就会终止执行,并在我们的控制台打印出我们的异常信息,其中就包括我们的异常的类型和堆栈的内容。此时我们可以使用捕获异常的方式进行处理:

try {
    //代码块
}catch(Exception e) {
    //异常的处理
}finally {
    //资源的释放
} 

其中的执行的流程:

  • 如果我们的try语句块的任何代码抛出了一个在catch子句中说明的异常类,那么:

    • 程序就会跳过try语句块的其余代码
    • 程序将会执行catch子句中的处理器代码
  • 如果我们的try语句块的任何代码抛出了一个在catch子句中没有声明的异常类,那么这个方法就会立即退出!!!

此时我们也可以使用在方法上声明需要抛出的异常:

public void readFile(String filename) throws IOException {
    ...
} 

此时我们就会将这个异常进行传递,传递给调用这个方法的上层处理器进行处理,但是这个规则在有些场景中是不适用的:

  • 父子类异常处理机制中,如果编写了一个覆盖了父类的方法,而这个方法又没有抛出异常,那么这个方法就必须捕获方法代码中的每一个受查异常。我们不允许子类的throws说明符中出现超过父类方法中所列出的异常类的范围。

捕获多个异常

我们可以同时捕获多个异常,即我们在一个try代码块种可以捕获多个异常类型,并对不同的类型的异常进行不同的处理。

捕获多个异常的时候,我们的异常变量隐含为final变量。

finally子句

当我们进行抛出一个异常,就会终止方法中剩余代码的处理,并退出这个方法的执行。此时我们可以使用finally子句进行资源的回收。

不管是否有异常发生,我们的finally子句中的代码都会被执行。

细节点:
  • 当我们的finally子句中包含return语句的时候,将会出现一种意向不到的结果。假设此时我们得try语句块中有return语句,此时在方法返回之前,我们的finally子句的内容将会被执行。

    public class TestFinally {
        public static void main(String[] args) {
            int res = find(2);
            System.out.println(res);
        }
    
        private static int find(int n) {
            try {
                int r = n * n;
                return r;
            }finally {
                System.out.println("finally 代码块");
            }
        }
    }
    
    输出结果:
    finally 代码块
    4
    
  • 如果上面的代码除了我们的try语句块中存在return语句,我们的finally子句中也存在一个return语句,此时我们finally语句中的return返回值将会覆盖原始的返回值

    public class TestFinally {
        public static void main(String[] args) {
            int res = find(2);
            System.out.println(res);
        }
    
        private static int find(int n) {
            try {
                int r = n * n;
                return r;
            }finally {
                System.out.println("finally 代码块");
                if (n == 2) return 0;
            }
        }
    }
    
    输出结果:
    finally 代码块
    0
    

堆栈轨迹(stack trace)

堆栈轨迹(stack trace)是一种方法调用过程的列表,它包含了程序执行过程中的方法调用的特定位置。

我们可以使用Thread.getAllStackTrace方法,它可以产生所有线程的堆栈轨迹。

异常代码测试

举例:我们的本地D盘下1.txt文件不存在,此时由于FileNotFoundException是IOException的子类,故匹配了FileNotFoundException的catch子句,只会打印e1,不会打印e2的异常信息

public class TestIO {
    public static void main(String[] args) {
        ObjectInputStream inputStream = null;
        try {
            inputStream = new ObjectInputStream(new FileInputStream("D:\\1.txt"));
            Object object = inputStream.readObject();
        } catch (FileNotFoundException e1) {
            System.out.println("FileNotFoundException");
            e1.printStackTrace();
        } catch (IOException e2) {
            System.out.println("IOException");
            e2.printStackTrace();
        } catch (ClassNotFoundException e3) {
            System.out.println("ClassNotFoundException");
            e3.printStackTrace();
        }finally {
            /*
            * public interface ObjectInput extends DataInput, AutoCloseable
            * ObjectInputStream底层实现了AutoCloseable接口,在try代码块退出的时候,会自动调用inputStream.close()方法
            * */
        }

    }
}

输出结果:

FileNotFoundException
java.io.FileNotFoundException: D:\1.txt (系统找不到指定的文件。)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at com.feng.io.TestIO.main(TestIO.java:15)

同时,我们的ObjectInputStream底层实现了ObjectInput接口,而我们的ObjectInput接口实现了AutoCloseable接口,它的内部包含一个close()方法,这个方法会声明为抛出一个IOException,它会在我们的try语句块退出的时候,自动的调用close方法,帮我们关闭资源。

Agentic AI商业化落地指南:提示工程架构师的7步优化法 Agentic AI(具备自主感知、决策与行动能力的智能体系统)是未来AI商业化的核心方向,其价值在于将大模型的“认知能力”转化为“实际行动”,解决复杂商业场景中的自动化与个性化需求。而提示工程(Prompt Engineering)作为连接人类意图与智能体行为的“翻译器”,直接决定了智能体的可控性、效率与用户体验,是Agentic AI商业化落地的关键支撑。本文结合第一性原理与工程实践,提出提示工程架构师的“7步优化法”,覆盖从“商业目标定义”到“规模化推广”的全流程。通过理论框架推导架构设计拆解。 阅读详情

相关推荐

ZYNQ裸机双网口通信实战:手把手教你用SDK和LWIP配置PS+PL以太网(附完整源码)

本文详细介绍了在ZYNQ裸机环境下实现双网口通信的全流程,包括硬件配置、LWIP协议栈优化及TCP通信实现。通过Vivado SDK和LWIP协议栈,开发者可以高效配置PS端内置网口与PL端扩展网口,提升嵌入式网络应用的灵活性和性能。附完整源码,助力快速开发。

weixin_30831529的博客 421

吃透Java异常体系

Java的异常都是派生于Throwable类的一个实例,所有的异常都是由Throwable继承而来的。Throwable有分为了Error类和Exception类。 Error(错误) Error 类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误。Error表示比较严重的问题,一般是JVM运行时出现了错误,如没有内存可分配抛出OOM错误、栈资源耗尽抛出StackOverflowError错误、Java虚拟机运行错误Virtual MachineError、类定义错误NoClassDefFoun

二豪码字 671

Unity Shader学习笔记/Urp/水墨风效果

Unity Shader学习

qq_63133691的博客 2117

Java异常处理

异常分类 在Java程序设计语言中,异常对象都是派生于Throwable类的一个实例。但在下一层立即分解为两个分 支:Error 和 Exception。 Error 类层次结构描述了 Java 运行时系统的内部错误和资源耗尽错误。 应用程序不应该抛出这种类型的对象。 如果出现了这样的内部错误, 除了通告给用户,并尽力使程序安全地终止之外, 再也无能为力了。这种情况很少出现。 在设计 Java...

书香水墨 601

微前端实战:MicroApp内存泄漏优化策略与性能调优

本文分享了在大型后台管理系统微前端化过程中,使用MicroApp框架时遇到的内存泄漏实战问题与优化策略。通过深入分析沙箱机制,提出动态加载、精准卸载、沙箱配置优化及第三方库补丁等核心方案,并结合Vue/React子应用专项检查清单,有效解决了内存占用飙升问题,为微前端架构的性能调优提供了系统性解决方案。

weixin_29014939的博客 277

Unity中基于SkinMeshRenderer的骨骼动画换装系统优化实践

本文深入探讨了Unity中基于SkinnedMeshRenderer的骨骼动画换装系统优化实践。针对换装卡顿、显示错误等常见问题,文章剖析了SkinnedMeshRenderer的核心数据原理,对比了“数据替换”与“实体替换”两种主流方案的性能差异,并详细阐述了通过骨骼字典缓存、对象池管理、材质合并与Draw Call优化等实战技巧,构建高性能、高稳定性的生产级换装系统。

weixin_29008055的博客 314

java异常处理

什么是异常 异常处理 如何捕捉异常? finally语句 常见异常 自定义异常 那么具体如何自定义异常类呢? throw关键字 throws关键字 运行时异常 异常处理流程

随便写点C++和JAVA的知识 6301

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节

本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。

e4f5g6h7的博客 437

【Java】—— Java异常处理 总结

1. 什么是异常?指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。​2. 异常的抛出机制Java中把不同的异常用不同的类表示,一旦发生某种异常,就`创建该异常类型的对象`,并且抛出(throw)。然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。​3. 如何对待异常对于程序出现的异常,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,

weixin_63106307的博客 1166

基于STM32L4XX、HAL库的RTL8211FSI-CG以太网收发器(PHY)驱动程序设计

一、简介:RTL8211FSI-CG是Realtek公司生产的一款高性能、低功耗的单端口10/100M以太网收发器(PHY)。它通过RMII(Reduced Media Independent Interface)或MII接口与MAC控制器连接。

zhusl6688的博客 531

解锁RK平台黑科技:DPDK加速与硬件卸载实战

本文探讨了在RK平台上通过DPDK加速与硬件卸载技术构建高性能网络架构的方法。RK平台凭借强大的硬件性能为高并发网络处理提供基础,而DPDK通过用户态驱动、轮询机制等技术绕过内核瓶颈,显著提升数据包处理效率。硬件卸载则将校验和计算等任务交由专用硬件,释放CPU资源。实践案例显示,该方案可使网络吞吐量提升至理论极限,延迟降至5ms以下,CPU利用率降低40%。文章详细介绍了配置步骤、优化方法和常见问题解决方案,并展望了该技术在5G、车联网等新兴领域的应用前景。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 1279

java异常处理底层_Java异常处理机制

什么是异常?异常本质上是程序上的错误,错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误。编译期间的错误通常是基础的语法错误,比如括号没有正常配对、语句结束后少写了分号,关键字编写错误等,编译器会对这些错误给出提示,帮助我们进行修订。运行期间的错误只有程序运行时才能看到错误的提示,比如数组访问时下标越界、使用空对象调用方法、算术运算时除数为0、类型转换时无法正常转型等,运行期间的错...

weixin_29471541的博客 779

Open3D 模拟退火算法优化的ICP点云配准

传统ICP算法易陷入局部最优且对初始位姿敏感,而SA算法通过概率性接受劣解,能够在高温阶段广泛探索解空间,低温阶段精细收敛。

点云侠的博客 244

Java异常处理终结篇——如何进行Java异常处理设计

使用Java异常的人很多,但能合理使用的却不多,Java异常处理设计是一个冷门的话题,但好的异常设计会让程序有质的变化,所以本文从各个方面分析便总结了,在Java程序中,如何进行异常设计。

登高而望远 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java分层异常处理_Java异常处理总结

1 异常处理的重要性对于一个应用系统,设计一套良好的异常处理体系是很重要的,因为它对于程序的后期维护有十分重要的意义。应用系统的异常处理体系或者说框架,应该在系统设计初期的时候就考虑清楚,这样可以避免开发阶段由于异常处理体系的混乱而引起的不必要的重构工作。2 Java异常体系从类图中可以看出java异常的类继承关系,Throwable是所有异常和错误的父类。它的两个子类Error和Exceptio...

weixin_42514783的博客 495

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【 java 异常处理】一文速通 java 异常处理

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等。因此异常处理就显得十分重要!

阿牛的博客 959

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java异常处理机制

作者:小符 撰写时间:2018.4.24 学会了异常处理可以帮助你去掉一些在代码中不必要的麻烦,可以在发生错误时,抛出错误,让你的程序减少奔溃的几率。当发生错误时,可以在短时间内找到错误所在行,会节省很多时间,让程序更加健壮。 Java异常处理机制为:抛出异常,捕捉异常,处理异常。 语法格式: try…catch 在使用try…catch捕获处理异常时需要注意: **·**不要过度使用异常,不能使...

白夜光的博客 3894

Java 异常处理

在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。所有异常都必须是 Throwable 的子类。如果希望写一个检查性异常类,则需要继承 Exception 类。如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。可以像下面这样定义自己的异常类:只继承Exception 类来创建的异常类是检查性异常类。下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。

qq_25502783的博客 659

Java的异常处理机制

一、什么是java异常? java异常指在程序运行时可能出现的一些错误,如:文件找不到、网络连接失败、非法参数等。异常是一个事件,它发生在程序运行期间,中断了正在执行的程序的正常指令流。Java通过API中Throwable类的众多子类描述各种不同的异常。因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。 Java异常类...

BoSea 5万+

java 异常处理总结

征文 | 从高考,到程序员    深度学习与TensorFlow入门一课搞定!    每周荐书 | Web扫描、HTML 5、Python(评论送书) java 异常处理总结 标签: 异常处理java 2016-09-22 10:30 80人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博

qq_36638469的博客 539

java future 异常处理_Java异常处理总结

转自:http://blog.51cto.com/lavasoft/18920Java异常处理总结异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦!Java语言在设计的当初就考虑到这些问题,提出异常处...

weixin_39619270的博客 1713

java异常处理语句是,java 异常处理

JAVA的异常处理的语句为:try-catch-finally,在这个语句中catch语句可以有一个或多个,finally语句可以省略.但是 try语句后至少要有一个catch语句或finally语句.JAVA异常处理机制只能处理Throwable类或其子类对象,所以自定义异常类层次需要选取Throwable类或其某个子类作为父类。JAVA异常处理大致可以分为两类:JAVA对不同的异常类采取不同的...

weixin_42449311的博客 1667

理解Java异常处理机制——Java异常处理的一个综合实例

理解Java异常处理机制——Java异常处理的一个综合实例                                   佟强 2009年12月8日声明抛出异常如果程序员不想在当前方法内处理异常,可以使用throws语句声明将异常抛出到调用方法中。调用方法也可以将异常再抛给其他调用方法。如果所有的方法都选择了抛出此异常,最后Java虚拟机将捕获它,输出相关的错误信息,

佟强 6202

java异常处理的实例_Java异常处理十个案例

异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了几个异常处理特性,以try,catch 和 finally 关键字的形式内建于语言自身之中。Java 编程语言也允许你创建新的异常,并通过使用 throw 和 throws关键字抛出它们。事实上,在Java编程中,Java的异常处理不单单是知道...

weixin_32199769的博客 1607

Java异常处理详解

Java异常处理详解 一、什么是异常 异常的英文单词是exception,字面翻译就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用、数组下标越界、内存溢出错误等,这些都是意外的情况,背离我们程序本身的意图。错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误,在编译期间出现的错误有编译器帮助我们一起修正,然而运行期间的错误便不是编译器力所能及了,并且运行期间的错误往往是难以预料的。假若程序在运行期间出现了错误,如果置之不

qq_47897078的博客 1448
上一篇: java内部类的相关知识点
下一篇: LRU缓存机制-Java代码实现
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值