异常
JAVA(异常)
异常的体系结构
最顶级的Throwable:错误,异常
Error:正常情况下,不太可能出现,绝大多数Error都会导致程序处于一个非正常的状态下, 基本上很难恢复。在外力的作用下,不考虑。Error是Throwable的子类,它是在Java 程序处理范围之外的
Exception:在Java语言中,将程序执行中发生的不正常的情况称之为异常。Exception也是 Throwable的子类。
编译期异常:写代码的时候,抛异常。如果编译器不解决,会编译不通过
运行期异常:RuntimeException,运行时会抛异常,平时没事
自定义异常:
Java中异常机制虽然很完善,但是结合实际业务还差很多。
年龄出现负数需要自定义异常、电商搜索乱码需要自定义异常
怎么自定义异常?
- 所有的异常必须是Throwable的子类
- 如果要定义一个编译期异常,需要继承Exception类
- 如果要定义一个运行期异常,需要继承RuntimeException类
异常链
一个异常被抛出去之后会继续被调用这个方法的方法捕获或抛出,异常会扩散
只要说解决异常、处理异常、捕获异常就是try ... catch
throws
如果一个方法没有捕获一个编译期异常,该方法必须使用throws来声明
1.在方法里直接try ... catch解决
public void info(){
try{
show();
}catch (MyException e){
e.printStackTrace();
}
}
2.在方法里抛异常给主函数,在主函数里try ... catch解决
public void show() throws Exception{
}
//JVM
public static void main(String[] args){
try{
new Ch01().info();
} catch (Exception e){
e.printStackTrace();
}
}
规定:主方法里不允许继续往下抛异常
throws并不是真正的解决了异常,只是把异常抛给了下一级调用者。
throw和throws的区别
throws出现在方法的声明处,可以抛出多个异常(用逗号隔开)
throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw:则是用来抛出一个具体的异常类型。
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
throw:就是自己处理一个异常,有两种方式要么是自己捕获异常try...catch代码块,要么是抛出一个异常(throws 异常)
finally关键字:
- finally用来创建在try码块后面执行的代码块
- 无论是否发生异常,finally代码块中的代码一定会执行。一班finally中的代码都是用来释放资源的。
- Finally无论是否出现异常,都会执行
补充
catch可以写多个异常(可以捕获多个异常)
重写的另一个规则:重写的方法不能抛出比被重写方法更大的异常类型
习题:
一,简答题
问题:
1. 请描述异常的继承体系
2. 请描述你对错误(Error)的理解
3. 请描述你对异常(Expection的理解)
4. 请描述你对运行时异常(RuntimeException)的理解
答:
1. 异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类:
java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。
2. Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。
3. Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。
4. 运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。
练习二:throw与throws的区别
问题:
1. 请描述throw的使用位置,作用是什么?
2. 请描述throws的使用位置,作用是什么?
答:
1. throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。
2. throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常对象抛给方法调用处。
练习三:异常的处理方式
问题:
1. 异常处理方式有几种,分别是什么?
2. 详细阐述每种方式对异常是如何处理的
答:
1. 异常的处理方式有两种,分别是使用throws和try...catch...finally
2. throws用在方法的声明上后接异常类名,是把异常抛给调用者进行处理
3. try...catch...finally是捕获异常,自己处理,处理完毕后面的程序可以继续运行
a) try代码块中是可能出现异常的代码
b) catch代码块,是遇到异常,对异常进行处理的代码
c) finally代码块是无论是否发生异常,都必须执行的代码,用于释放资源.
练习四:常见异常,及产生原因
问题:请列举常见异常,并说明产生原因。
答:
NullPointerException:空指针异常。
当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。
ArrayIndexOutOfBoundsException:数组索引越界异常。
当对数组的索引值为负数或大于等于数组大小时抛出此异常。
ArithmeticException:算术运算异常。
程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
NumberFormatException:数字格式异常。
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。

浙公网安备 33010602011771号