00015.03 异常处理关键字:throws 和 throw

前言

异常处理的方式之一:
在当前方法中直接用try…catch处理

异常处理的方式之二:
在当前方法中不处理,扔/抛给调用者处理

一、throws是什么?

语法格式
throws的语法格式:
【修饰符】 返回值类型 方法名(【形参列表】)throws 异常列表们{
}
说明:throws后面可以跟好几个异常,顺序无所谓,每一个异常之间使用,分割
00015.03 异常处理关键字:throws 和 throw
下面看这段代码

00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
如果我们把ArithmeticException去掉,那么获取的异常是什么异常呢,再重复一下操作

00015.03 异常处理关键字:throws 和 throw
只能笼统的获取到异常
所以

throws的好处:

(1)throws:告知被调用者,我这个方法可能会抛出哪些异常,使得调用者可以明确的知道应该catch什么异常
如果没有throws,那么调用者就不清楚,只能按照Exception处理,或者根据错误经验来处理。

(2)编译时异常,如果在当前方法中不用try…catch处理,编译不通过,那么可以通过throws明确的说明,抛给调用者处理

下面看代码,我们写一个文件复制的方法,这个就叫**“编译时异常”**
00015.03 异常处理关键字:throws 和 throw
它就是在提醒你,你应该为这段代码加上 try……catch
00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
因为你不加这个(不使用这两种方式)编译不会通过,以上代码就表示,我这里不处理,我给你扔出去,丢给上级处理
在上级就可以捕获到
00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw

关于方法重写时,对throws抛出的异常的要求:

00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
通过上面的代码,我相信已经有点蒙蔽了,为什么有时候行有时候不行,这里面到底有什么样具体的要求呢?

子类重写的方法抛出的异常类型必须<=父类被重写的方法抛出的异常类型。
例如:Exception > RuntimeException > ArrayIndexOutOfBoundsException

为什么这样规定呢?
原因跟多态一样,如果不规定,多态的时候就会出问题

整理重写的要求:

(1)方法名:相同
(2)形参列表:相同
(3)返回值类型:
基本数据类型与void:相同
引用数据类型:<=
(4)修饰符
权限修饰符:>=
其他修饰符:不能是final,private,static
(5)抛出的异常类型:<=

二、throw

没有s 的 throw 是干嘛的呢?
用于手动抛出异常对象。
语法格式:throw 程序员new的异常对象;
可以代替return语句,结束当前的方法

00015.03 异常处理关键字:throws 和 throw

00015.03 异常处理关键字:throws 和 throw
下面写一个账号类
依次添加属性、构造器、get/set 方法 等
00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
下面我们用一下这个方法
00015.03 异常处理关键字:throws 和 throw
如果出现了异常,假如我们取2000
00015.03 异常处理关键字:throws 和 throw

00015.03 异常处理关键字:throws 和 throw
00015.03 异常处理关键字:throws 和 throw
这个getMeessage() 就是下面你填的
00015.03 异常处理关键字:throws 和 throw
throw相当于给了我们另外一种把信息往回传的途径
00015.03 异常处理关键字:throws 和 throw
如果在某个方法中,用throw语句手动抛出异常对象,那么如果该对象是运行时异常就没关系,方法不用throws
如果是编译时异常的话,这个方法还要加 try……catch或者throws

throws 可以抛出“系统预定义异常”或”“用户1自定义异常”

面试题:throw和throws什么区别?
(1)throw用于手动抛出异常对象,是个可执行的语句
(2)throws,在方法签名中,声明方法可能抛出什么异常,让调用者来处理这些异常。

总结

throw 可以代替return 语句 带回异常信息