今天的绝对不水了,甚至有点难
throws关键字处理异常
首先介绍比较简单的一种处理方式:throws
关键字
这种方法的核心是: 将当前方法产生的代码异常上报给它的调用者,让上一级方法来处理这个异常。当然,上级方法依然可以选择继续上报,直到异常到达了:
public static void main (String[] args) {}
此时如果 主方法 还要上报,那么JVM会收到这个异常,而JVM会选择直接调停这个程序
就比如,你(当前对象)的客户问你赔钱,你不要赔钱,于是你把这件事告诉了经理(异常上报至上级方法),然后你们公司的都不想处理,全都上报给上级(异常上报),最后股东大会或董事会(main方法)知道了这件事,还不想处理,于是公司(JVM)因为失信而破产(JVM调停程序)【当然这是绝对不可能的】
现象演示
注:画红线的语句不用看懂,异常阶段我们只需要知道它会抛出FileNotFoundException
,它是 IOException
的子类,上节课中我们提到过这是一个编译时异常,必须马上处理,顺便调用一下
注:所以我们处理了,在当前方法的位置上上报了一个异常,但是很明显这样是不能解决问题的,因为调用时又会出现问题。然后我们继续上报异常,再在问题代码下面准备一个有现象的语句
注:至此,我们的编译器已经发现不了问题了,但实际上是 ->
图中的 FileInputStream()
中需要传入一个字符串,用于表示文件的位置(URL),但实际我们传入了一个空字符串,所以这句代码不可能找到任何文件,则异常一定会产生。根据上文的讲述,JVM将会调停程序,可以预测控制台的现象将会是:FileNotFoundException
的堆栈信息被打印,且 "hello world"
不输出
try...catch语句处理异常 & 语句详解
这种方法的核心是: 方法内出现了异常,但当前方法自己把异常捕捉了,处理好了,上级不知道有出现过这个异常。这才是真正解决了异常
接上一模块的例子,你自己掏荷包把钱赔给客户了,所以客户的问题解决了,你的老板根本不知道他可能需要赔钱,公司也没有破产
现象演示
注:看控制台中我涂成橙色的字。 之前扔给JVM的异常,现在我们抓走了,现在我们解决了这个异常,程序还可以继续运行(你公司还在)
语句深入
到目前为止,这个语句还很简单对吧ovo【坏笑】 接下来我们来看看这个语句的几个特性
首先,catch语句是可以写很多的:
但是你要这样写,必须要注意一个不可重复处理,因为这样是没有意义的。 当然没有卧龙凤雏会这样写:
但是可能有同学觉得这样是可以的:
不可以!IOException
是 FileNotFoundException
的父类,也就是到第二个catch的时候,异常已经确保处理完了,不要再处理一遍
另外一个特性,这个语句的全部内容其实是:try...catch...finally
语句
这个语句可以这样搭配:
- try...catch
- try...catch! catch! catch!
- try...finally
- try...catch...finally
- try...catch! catch! catch! ...finally
也就是说,try一定要有,其它语句任意搭配,finally只能在最后面写一次
那么finally子句有啥用呢?(灵魂拷问,噩梦开始)
finally子句中的Java语句,不管try和catch怎么了,必须执行一次然后直接退出丝毫不拖泥带水。所以这个语句经常被用于干一些关系到项目生命安全的任务,比如关流,关数据库(好像也没那么夸张)
但是有例外,也是常遇到的考点 一种是JVM被强制关闭,另一种是遇到了return关键字 这种情况下,finally子句不执行,因为return语句必须是最后执行的,执行了方法直接结束:
而当finally子句也有return,则这里的return会最终执行:
比较迷惑,建议多看两遍
自定义异常
我们要知道,JDK里的异常一定是不够的
比如我们做项目,检测到用户长得太丑,需要抛出异常:LooksTooUglyException
但是这一看就不像是JDK里面会有的异常
所以我们要自己写,办法很简单,继承一下 Exception
类,写两个构造器,连构造器里的东西都不要自己写的,用父类的就好了:
然后再找一个合适的地方告诉用户他很丑:
就好了。。。???很简单吧
finally——
接下来我要去期末考试了,再过一个星期要学考了,所以,尽量日更ovo 暑假直接高产!!!