透彻理解异常并合理使用异常

一张长图透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试! 下图代码说明了,Spring在初始化全部 单例Bean以后,会执行 SmartInitializingSingleton 接口。SpringBoot 会在Spring完全启动完成后,才开启Http流量。这给了我们启示:应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。 阅读详情
对于异常(Exception)的基本使用相信大家已经比较了解了。不了解的童鞋请参见博文: Java异常处理机制
其实比较棘手的问题是什么场合用什么异常?checked异常还是runtime异常?是抛出异常还是捕获异常?
下面举例来探讨一下这个问题;

回顾异常处理机制:

异常机制使程序中异常处理代码和正常业务代码分离,也就是把某些异常交给异常处理器去处理,不让JVM直接处理。
JMV的处理方式时打印异常跟踪栈的信息,并终止程序运行,比如:
public static void main(String[] args) {
	System.out.println(1 / 0);	// 程序抛出java.lang.ArithmeticException: / by zero 然后程序结束。
	... // 下面的代码无法得到执行。
}
于是乎,我来捕捉一下这个异常好了:
public static void main(String[] args) {
	try {
		System.out.println(1 / 0); // 如果捕捉到异常,生成对应的异常类的对象
	}catch(ArithmeticException ae) { // 如果捕捉到异常对象,进行自定义异常处理
		ae.printStackTrace(); // 简单的异常处理,打印异常的跟踪栈信息
	}
	System.out.println("main方法结束"); // 这就是异常处理代码和正常业务代码分离的好处,逻辑上清晰,并且单独处理被捕获的异常。
}
问,上面的异常需要被捕捉吗?算术异常.
如果按照平常思维来思考,程序运行时有异常退出就行了。还捕捉啥呢?还干嘛分为checked异常跟runtime异常呢?
1:捕捉异常是为了让程序单独处理被捕获的异常。
2:区分checked异常跟runtime异常,是为了增强程序健壮性。
checked(知道编译时可能会有问题,我能处理,或者你来处理,最后必须处理(抛向JVM)),编译时就必须给我说清楚怎么处理。
runtime(知道运行时可能会有问题,我愿意处理就处理,你爱处理不处理),运行期出了错你负责。
无论是哪种异常,都不一定100%发生异常,100%发生异常的代码?你会写吗?你会写编译器让你写吗?

分析与解读:

运行时异常意思就是:编译时无法发现只有在运行时才会出现的异常,比如NullPointerException,编译期是无法判断的。
如果发生了问题一定是代码bug所致,至于会不会发生问题,要看什么时候程序会运行到出错的地方。
对于运行时异常,如果知道可能会有问题,又不影响编译,那就向上抛出就好了。声明让调用者处理该运行时异常(站在设计者的角度)。
运行时异常即使使用try...catch块进行捕捉,那也不是真正能处理掉的,下次程序执行到这又会出现异常,因为代码本身有Bug.
如果不用异常类去描述这些异常,那程序出现异常了,岂不死翘翘了,所以说,异常的出现是为了增强程序健壮性。
其它的runtime异常类像:IndexOuterOfBoundsException、ArithmeticException、ClassCastException

checked异常意思就是:编译时就知道这个地方可能会出现异常,你的程序代码很健康,但是编译器知道你的代码中某个操作会出现问题,或者说你的代码中的某个操作已经抛出异常了,你必须对其进行处理。
比如FileInputStream fis = new FileInputStream("a.txt"); 此构造抛出FileNotFoundException,所以调用者必须处理该异常,否则编译不通过。
上面的操作是通过打开一个到实际文件的连接来创建一个FileInputStream,文件会100%不存在吗?如果发生错误了肯定是在运行时吧?
那这老家伙为何抛出编译时异常呢?!他只是觉得你必须对可能产生的异常进行捕捉罢处理了,认为你能搞定的。怎么搞看你需求。
看一下他的构造器源码:
public FileInputStream(String name) throws FileNotFoundException { // 他抛出了编译时异常
	this(name != null ? new File(name) : null);
}
再来看一下File构造器的源码:
public File(String pathname) {
	if (pathname == null) { // 他抛的是运行时异常!注意是throw,不是throws。
	    throw new NullPointerException();
	}
	this.path = fs.normalize(pathname);
	this.prefixLength = fs.prefixLength(this.path);
}
看出问题了吗?FileInputStream构造器亦可以不处理或者捕获处理该File构造器抛出的运行时异常,但他之所以选择抛出编译时异常,是觉得需要处理并且有能力处理该异常。


再来看InputStream类的public abstract int read() throws IOException;  read方法涉及到I/O操作,需要访问外部资源。由于外部资源不受JVM控制,
所以有可能会出现异常,操作失败或者操作中断或者没有权限访问。对于这些可能出现的异常,不也是运行时才能出现的吗?抛出IOException,还是觉得需要处理罢了。增强程序健壮性。
有人说他内部也没有再去调用抛出运行时异常的方法了啊?这里read方法做的是访问系统底层操作,代码不是Java写滴。


透彻理解编译时异常(checked):到底编译时异常是个啥玩意?我都没有运行程序咋还就出现异常了?别叫名字给骗了,编译时异常那就是编译错误。
编译时异常是对运行时异常的约束。约束你对异常进行处理。真正的异常是运行时异常。编译时异常检查的还是语法错误,因为你使用关键字抛出了编译时异常类。


总结:
处理异常,是一门学问,异常处理的顺利不顺利与前期对项目的面向对象分析(OOA)是否清晰合理有直接关系。
在这里只是对异常进行了看似易懂的描述,真正到了实际开发中,因为项目复杂度的提升,对异常的合理处理也必须得要求很灵活。
而这个灵活需要靠开发经验的增多而产生一种感觉,感觉是建立在正确的认识之后的,感觉就没法像大家描述了,感觉是无法用语言表达的,哈哈。


原创文章,转载请注明出处: http://blog.youkuaiyun.com/thinking_in_android
有关SPSS中Fisher精确检验无法进行的解决方法(由于无法打开临时文件,因此无法进行计算) 最近在帮一个四年生完成她的毕业论文,在用SPSS进行R×C表检验的时候,发现Fisher精确检验的结果无法显示,提示为“由于无法打开临时文件,因此无法进行计算”,大概像下图一样。 (这图是从网上找的) 然... 阅读详情

相关推荐

【SWPUCTF 2021 新生赛】hardrce

对每个字符的ASCII值进行按位取反操作(这种要进行自增马进行绕过。

XiaoHei的博客 460

索引越界异常Exception java.lang.IndexOutOfBoundsException

1、IndexOutOfBoundsException 是索引越界异常 表示某种索引(例如数组、字符串或向量)超出范围 举例:请看下面代码 public static void main(String[] args) { List<Object> list = new ArrayList(); list.add("添加的第一个元素python"); list.add("添加的第二个元素java"); list.add(

SUMMERENT的博客 4万+

手把手教你用USBasp给Arduino UNO烧写程序(ICSP模式,含BootLoader选择指南)

本文详细介绍了如何使用USBasp编程器通过ICSP模式为Arduino UNO烧写程序,包括硬件连接、软件配置、Hex文件处理和BootLoader选择指南。内容涵盖从新手入门到高级优化的全流程,帮助开发者高效完成烧写任务,特别适合需要修复BootLoader或进行量产烧写的用户。

weixin_33958381的博客 364

认识理解异常

【本章目标】 1. 异常概念与体系结构 2. 异常的处理方式 3. 异常的处理流程 4. 自定义异常类

你们的伟仔的博客 186

在overleaf中使用bibtex引用参考文献

最近在挑选写tex的平台,挑来挑去,个人感觉overleaf给我带来的体验感是最舒适的。不过由于对内部的文件组织和make进行了一层封装,所以与一般的本地平台编译tex会有一点不同。此处写一下在overleaf中使用bibtex的方法。 在tex中使用bibtex引用文献是一件很舒适的事,毕竟这是tex的优点之一(要是tex比word难用,我干什么不去用word,hhh) 第一步,我们创建一个.bib文件,名字随便起,我这边起为reference.bib。 然后打开谷歌学术,搜索你想要引用的文章,并找到

锦恢的博客 4万+

分布式光纤传感(DFOS)DTS/DAS/DSS 三合一:10公里管线监测实战与数据解读

本文详细介绍了分布式光纤传感(DFOS)技术在10公里管线监测中的实战应用,通过DTS(温度)、DAS(振动)、DSS(应变)三合一系统,实现对管线健康状态的立体感知。文章涵盖工程部署、数据采集、多物理量数据融合及噪声抑制等关键技术,展示了如何通过一根光纤完成复杂监测任务,显著提升管线安全性和维护效率。

weixin_29168153的博客 315

了解 异常

Java中如何进行异常处理、异常的分类

Fat_peach的博客 802

Nuclei漏洞扫描:从零到精通的Windows实战指南

本文详细介绍了Nuclei漏洞扫描工具在Windows平台上的安装与使用教程,从基础安装到高级实战技巧全面覆盖。通过具体案例展示如何利用Nuclei的模板库快速检测常见漏洞,并提供自定义POC开发指南,帮助安全从业者高效开展漏洞扫描工作。

weixin_28683689的博客 249

JAVA基础:了解异常类、异常处理,自定义异常、异常在方法重写细节

异常 1.常见的异常: 数组下标越界 ArrayIndexOutOfBoundsException 类型转换异常 ClassCastException 空指针异常 NullPointerException 数字方面的异常 2.异常是什么? Java代码在运行时候发生的问题就是异常,在Java中,把异常信息封装成了一个类。当出现了 问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置、原...

T_Tonz的博客 625

PADS VX2.4差分对设置避坑指南:常见错误与解决方案

本文深度解析了在PADS VX2.4中进行高速PCB设计时,差分对设置的核心要点与常见陷阱。针对Layout规则设置、Router布线实战中的阻抗控制、线长匹配等关键环节,提供了具体的避坑指南和解决方案,帮助工程师确保信号完整性,提升设计质量。

weixin_29216049的博客 359

Vulkan入门系列0- Vulkan与OpenGL的区别

虽然Vulkan和OpenGL都是对GPU的抽象,都能达到相同的功能,但它们的设计理念不同,可以说设计差异是非常之大,由于OpenGL从1992年到现在,已经有30多年的历史,GPU功能日新月异,与当年不可同日而语,在OpenGL保持向下兼容情况下,还要在OpenGL基础上设计一套编程接口显然是不可能的,所以推出了新编程规范Vulkan。另外在一些无窗口的应用中,Vulkan可以有选择的不创建帧缓冲区,比如在数学运算,物理模拟,处理视频流的应用中并不需要窗口,所以Vulkan支持更灵活的应用场景。

GPU全栈博主 4068

【透彻理解异常并合理使用异常】

回顾异常处理机制:   异常机制使程序中异常处理代码和正常业务代码分离,也就是把某些异常交给异常处理器去处理,不让JVM直接处理。   JMV的处理方式时打印异常跟踪栈的信息,并终止程序运行,比如:   [java]   public static void main(String[] args) {   System.out.println(1 / 0); // 程序抛出ja...

102

微信小程序 - 解决微信支付报错 requestPayment:fail no permission 原因分析及排查处理(支付失败出错,无法唤起支付弹框面板,微信支付API报错请求付款:失败无权限)

微信小程序,微信支付,支付报错,errMsg: "requestPayment:fail no permission",支付失败,支付权限没问题,微信小程序支付报错,检查了appid正确依旧不行,微信小程序支付异常,苹果ios手机,安卓手机,开发者工具模拟器,最新解决教程,小程序wx.requestPayment报错/无响应,小程序支付 requestPaym,微信小程序认证,真机运行,小程序微信支付提示错误,微信小程序里使用微信支付错误提示,微信小程序支付异常,微信支付弹框拉不起来,小程序支付api,都检

🏆 前端领域优质创作者 1万+

编译时程序透彻理解异常并合理使用异常

废话就不多说了,开始。。。     对于异常(Exception)的基本应用相信大家已比拟了解了。不了解的童鞋请参见博文:     Java异常处置机制     其实比拟棘手的问题是什么场合用什么异常?checked异常还是runtime异常?是抛出异常还是捕获异常?     上面举例来探讨一下这个问题;          回顾异常处置机制:          异常机制使程序中异常...

weixin_33873846的博客 118

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入理解C++异常机制

https://www.cnblogs.com/hdk1993/p/4357541.html 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销。异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分。本文将在尽量少引入底层细节的前提下,讨论 C++ ...

君之剑的专栏 2462

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

一张长图透彻理解SpringBoot 启动原理,架构师必备知识

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行 SmartInitializingSingleton 接口。SpringBoot 会在Spring完全启动完成后,才开启Http流量。应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家 在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。例如 Spring CloudEureka服务发现组件,就是在 SmartLifecype中注册服务的!

Admans的专栏 1037

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一张长图透彻理解SpringBoot 启动原理

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行 SmartInitializingSingleton 接口。SpringBoot 会在Spring完全启动完成后,才开启Http流量。应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家 在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。例如 Spring CloudEureka服务发现组件,就是在 SmartLifecype中注册服务的!

lingqu+wx bjmsb06 1494

catch之后不抛出异常_Java 基础(十二)异常机制

异常一说谈到异常,可能就有小伙伴说,这个啊,我 try...catch...finally用得贼溜。别急哈,后面有个 案例,看完之后你肯定会觉得自己对异常的理解也不是那么透彻了,同时本文还可能会扫到你的一些知识盲点。额,扯远了~异常一般指不期而至的各种状况,如:文件不存在、空指针、非法参数等。异常是一个事件,发生在程序运行期间,干扰了正常的指令流程。Java 中使用 Throwable 类及其子类...

weixin_42513365的博客 3544

透彻理解SpringBoot 启动原理,架构师必备知识,不为应付面试

下图代码说明了,Spring在初始化全部 单例Bean以后,会执行SmartInitializingSingleton 接口。SpringBoot 会在Spring完全启动完成后,才开启Http流量。应该在Spring启动完成后开启入口流量。Rpc和 MQ流量 也应该如此,所以建议大家 在 SmartLifecype 或者 ContextRefreshedEvent 等位置 注册服务,开启流量。例如 Spring Cloud Eureka 服务发现组件,就是在 SmartLifecype中注册服务的。

2401_89230798的博客 1021

C++异常抛出机制

在我几年前开始写《C++编码规范与指导》一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了。没想到时隔几年以后才有机会把这个尾巴补完 :-)。 还 是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准。想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销。异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌

fortunate1y的专栏 1065

Java 异常未受检与受检 区别

原文链接 之前一直都知道异常分类可以分为受检和非受检,关于二者区别也大致了解但是,一直觉得没有很透彻地搞清楚,以至于有时候心里很纠结,这次下决心一定要弄清楚了。 二者的关键区别在于:用户是否是能在发生异常时做一些恢复处理。 举个例子说明: 对于受检异常中的文件不存在异常,我们写的文件读写程序,很有可能出现文件不存在的情况,那么一旦发生,我们需要catch住再做处理,比如给出提示文件不存在之类的提示...

qq_37390527的博客 315

异常类、常用类

一、异常类 (一)异常的继承关系 Throwable 它是所有错误与异常的祖宗类。 Error JAVA 中的严重错误,只能通过修改代码进行修正。 Exception 编译期异常,进行编译JAVA程序时出现的问题,Exception异常类及其子类都是继承自Throwable类,用来表示java中可能出现的异常,并且合理的处理这些异常。 RuntimeException 运行异常类,继承自Exception类,它以及它的子类只能在运行过程中存在,当出现时,只能修改源代码,此异常无法处理。000 ...

zyu12138的博客 257

一张长图透彻理解 SpringBoot 启动原理,架构师必备知识,不为应付面试!

虽然Java程序员大部分工作都是CRUD,但是工作中常用的中间件必须和Spring集成,如果不知道Spring的原理,很难理解这些中间件和框架的原理。一张长图透彻解释 Spring启动顺序测试对Spring启动原理的理解程度我举个例子,测试一下,你对Spring启动原理的理解程度。Rpc框架和Spring的集成问题。Rpc框架何时注册暴露服务,在哪个Spring扩展点注册呢?init-method...

公众号-老炮说Java 279
上一篇: Java异常处理机制
下一篇: Java多线程要点分析总结
flowciyu
博客等级 码龄15年 65粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值