Java中的异常处理---第二篇(共三篇,原理+具体实现和细节)

接上篇对Java中的异常的认识和分析(共两篇--异常认识和异常处理,此为一)-CSDN博客

这篇我们来谈一下Java中的异常如何处理? 如果对异常整体划分和异常体系不了解的朋友可以先去看看上篇文章,看完后对异常体系就会有一定了解并且对很多名词也会更加清晰,再来看如何处理异常就不会混乱。

Java中的异常处理---第二篇(共三篇,原理+具体实现和细节)_第1张图片

首先我们要清楚一点,在这篇文章中我们所谈论的所有异常处理方式都是针对Exception中的异常情况,对于Error我们是没有办法通过正常的异常处理来解决的(不知道为什么的可以去看看上篇文章)。而Exception分为编译异常和运行时异常,编译异常idea会提示---这是我们必须要解决的异常,我们可以选择抛出或自己解决(异常处理方式,不理解先接着看),而运行时异常,如果我们没有进行处理,Java默认是采取抛出的方式,一直抛出到最顶层JVM,然后打印栈中错误信息--这就是为什么我们有些小伙伴觉得异常处理平时很少去做,因为我们大部分异常都是运行时异常,而Java帮我们实现了默认的处理方式。

接下来我们具体介绍一下Java中的异常处理方式,有两种:try catch包裹和抛出异常。

try-catch-finally方式:

尝试(try)捕获(catch)异常并处理(处理代码在catch中),finally是不管异常是否解决都会去执行的代码块---一般用来做收尾工作(文件流的关闭,连接池的释放等等),注意的是,catch是可以有多个的,也就是对应不同的异常可以做不同的处理代码块,但是必须要满足一个条件---父类异常在后,子类异常在前(非常好理解,假如你第一个catch把最大的异常Exception类捕获了,那后面再去捕获比他更具体更小的异常就没什么意义了,你不管什么异常都会走第一个catch代码块了)同时,我们要知道这是一种积极方式---当你意识到此处代码块会出现问题,你没有选择把问题抛出给上一级调用者(不理解没关系,接着看)而是自己去解决问题。不管是编译异常还是运行时异常都可以使用这种方式!!

通过throw和throws抛出异常:

主要就是通过throw和throws去抛出异常(二者区别后面会说)。其实这种方式是一种消极方式---就是不管代码中出现什么情况,我们都通过把异常抛出给上层调用者,让上层调用者去处理,如果你一直抛,最顶层就是JVM去处理异常,而JVM很暴力--直接打印错误堆栈信息,这也是Java默认采取的异常处理方式。所以建议有异常还是要处理,一直抛不太对昂!

throw和throws的区别:

1. 位置不同:throws用在函数上,后边跟的是异常类,可以跟多个异常类。throw用在函数内,后面跟的是异常对象。除此之外功能也不同。但两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

2. 功能不同:

①throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先得处理方式。throw抛出具体的问题对象,执行到throw。功能就已经结束了跳转到调用者,并将具体的问题对象抛给调用者,也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。

②throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

然后就是要注意:如果子类重写父类方法,所抛出的异常类型要么和父类一样,要么是父类抛出异常的子类,绝对不可以抛出比父类异常范围更大的异常!!!

到这里我们异常的处理就基本阐述完了,还差一个自定义异常,觉得写的不错的可以点个关注和赞支持一下,我会接着更新下一篇---自定义异常。感谢各位的点赞和关注!

你可能感兴趣的:(Java语言类,java,开发语言)