异常
一.概述
异常就是在运行时期发生的不正常情况。在java中用类的形式对不正常情况进行了描述和封装对象。描述不正常的情况的类,就称为异常类。
异常体系结构:
Throwable :是java对不正常情况进行描述后产生的对象体系。无论是error,还是异常、问题,问题发生就应该可以抛出,让调用者知道并处理。该体系的特点就在于Throwable及其所有的子类都具有可抛性。
该体系的不正常情况分成了两大类:
① 一般不可处理的:Error
// 特点:是由jvm抛出的严重性问题。这种问题发生,一般不针对性处理,直接修改程序。
② 可以处理的:Exception
该体系的特点:子类的后缀名都是用其父类名作为后缀,阅读性很强。
注意:
凡是可以被throws和throw这两个关键字所操作的类和对象都具备可抛性。
二.异常的处理
对于异常的处理:java提供了特有语句进行处理(即try{}catch{})。
代码演示:
try{
需要被检测的代码 ;
}catch(异常类型 变量){
处理异常的代码(处理方式) ;
}finally{
一定会被执行的语句 ;
}
注意:
该处理异常的语句的主要搭配:try-catch、try-catch-finally、try-finally三种形式。
范例演示:
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">public class Demo {</span>
public static void main(String[] args) {
int x = 5;
int y = 0;
try {
//由于除数为零,导致异常发生
int retsult = x / y;
System.out.println("执行到我说明没有异常^_^");
} catch (Exception e) {
System.out.println("发生异常啦T_T");
e.printStackTrace();
} finally { // 通常用于关闭(释放)资源
System.out.println("我一定会被执行");
}
System.out.println("执行完成");
}
}</span><span style="color:#ff9966;">
</span></span></strong></strong></span>
三.自定义异常
1.自定义异常的定义
将可以自定义出的问题描述称为自定义异常。
2.自定义异常的条件
① 要想让一个类成为异常类,必须要继承异常体系,因为只有成为异常体系的子类才有资格具备可抛性,才可以被两个关键字所操作:throws、throw。
② 自定义异常类需要继承Exception或者其子类,通过构造函数定义来异常信息。
3.throws和throw两个关键字的区别:
throw:在函数内使用,后面跟着异常对象。如RuntimeException。
throws:可以在函数上声明异常。便于提高代码的安全性,让调用者进行处理,否则编译失败。后面跟着异常类,可以用逗号隔开跟多个异常类。
范例演示:(注意:注释中包含知识点注意点)
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;"> public void setGender(String gender) throws MyException { // throws在函数上声明异常</span>
if (gender.equals("男") || gender.equals("女")) {
this.gender = gender;
} else {
/*
* throw可以在方法体内抛出异常,但必须捕获或者 在方法体上用throws抛出
*/
throw new MyException("性别只能是男或者女哦!");
}
}</span></span></strong></strong></span>
四.异常相关注意事项
1.异常处理的原则
① 函数内容如果有抛出需要检测的异常,那么在函数上必须要声明。否则,必须在函数内用try/catch语句进行捕捉,否则将会编译失败;
② 如果调用到了声明异常的函数,那么要不就利用try/catch语句进行捕捉,要不就使用关键字throws直接抛出,否则将会编译失败;
③ 如果产生异常的功能内容可以通过本身解决,就使用用catch语句。如果解决不了,就需要通过使用throws关键字告诉调用者,由调用者进行解决;
④ 一个功能如果抛出了多个不同的异常,那么在调用时,就必须有对应多个catch语句进行针对性地处理。内部产生出几个需要检测的异常,就会抛几个异常,就需要通过catch语句处理几个。
范例演示:
<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">class Demo {</span>
public int show(int index) throws ArrayIndexOutOfBoundsException {
if (index < 0)
throw new ArrayIndexOutOfBoundsException("越界啦!");
int[] arr = new int[4];
return arr[index];
}
}
class ExceptionDemo {
public static void main(String[] args) {
Demo d = new Demo();
try {
int num = d.show(-2);
System.out.println("num = " + num);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.toString());
System.exit(0);// 退出jvm
} finally { // 通常用于关闭(释放)资源
System.out.println("finally"); // 由于前面执行了System.exit(0);,故不会执行此语句。
}
System.out.println("over");
}
}</span></span></strong></strong></span>
2.异常的注意事项
① RuntimeException以及其子类异常如果在函数中被关键字throw抛出,则可以不用在函数上进行声明;
② 子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类;如果父类抛出了多个异常,那么子类只能抛出父类异常的子集;总而言之,子类覆盖父类只能抛出父类的异常或者子类的子集。(该注意点必须记住,在今后代码开发必须要留心)
③ 如果父类的方法没有抛出任何异常,那么子类覆盖时绝对不能抛出异常,只能通过try/catch语句进行处理。
五.异常综合案例
通过以下关于异常的代码演示,进一步认识异常的相关知识: (注意:注释中包含知识点和注意点)<span style="font-family:KaiTi_GB2312;"><strong><strong><span style="font-family:KaiTi_GB2312;"><span style="font-size:14px;"><span style="font-family:KaiTi_GB2312;">class FuShuException extends Exception// 自定义的异常类</span>
{
private int value;
FuShuException(String mes, int value) {
/*
* 因为自定义异常继承于Exception,而且Exception再 继承Throwable的时候就已经复写了它的方法,所以可以直接引用
*/
super(mes);
this.value = value;
}
public int getValue() {
return value;
}
}
class Demo {
// 函数内抛出异常时,函数上应声明该异常
public int div(int a, int b) throws FuShuException {
if (b < 0)
// 如果除数是负数,则抛出自定义异常
throw new FuShuException("负数异常!出现负数了!", b);
return a / b;
}
}
class DemoExceptionTest {
public static void main(String[] args) {
Demo d = new Demo();
try {
int x = d.div(4, -1);
System.out.println(x);
} catch (FuShuException e) {
System.out.println(e.toString());// 打印对自定义异常的描述
System.out.println("错误的负数时:" + e.getValue());
}
}
}</span>
</span></strong></strong></span>