【Java笔记分享】异常(2)

今天的绝对不水了,甚至有点难


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语句是可以写很多的:

但是你要这样写,必须要注意一个不可重复处理,因为这样是没有意义的。 当然没有卧龙凤雏会这样写:

但是可能有同学觉得这样是可以的:

不可以!IOExceptionFileNotFoundException 的父类,也就是到第二个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 暑假直接高产!!!

java
182 views
Comments
登录后评论
Sign In
·

祝你期末考试取得好成绩!