----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
面向对象----异 常
(一)异常的概述:
异常:所谓的异常就是在程序运行的时候出现了不正常的情况。
在Java中,将常见的异常情况(也称之为问题对象,所谓的对象就是我们在描述事物时,问题出现的名称、问题所涉及到的信息、问题出现的位置,我要查找出现的问题,那么这些信息都是可以获取的),用面向对象的思考方式对其进行了描述与封装。
class Fu{
//处理方式
}
class LongTime{
//处理方式
}
public class Exception{
public static voidmain(String[] args){
sleep(-5);//时间为负数
}
public static void sleep(inttime){
if(time<0){
抛出 new Fu();//当时间为负的情况,这个对象中会包含着问题的名称、信息、位置等等
}
if(time>1000){
抛出new LongTime();//同上
}
}
}
在该程序中,把时间为负数和时间超长的情况,用类定义,封装成对象,通过抛出的形式,让调用者可以知道出现了异常。
总结:在Java中,将异常通过面向对象的思想封装成对象,用异常类进行了描述,从而将正常的流程代码与处理代码分离,提高了阅读性。
(二)异常—体系
异常—体系:将异常所出现情况的共性进行不断向上抽取,从而形成异常体系。
在异常中,最终问题就被分成两大类:
Throwable:无论是error还是Exception,问题发生就应该可以抛出,让调用者知道并处理。
//该体系的特点就在于Throwable及其所有的子类都具有可抛性
//可抛性是通过两个关键字来体现的:
throws和throw,凡是可以被这两个关键字所操作的类和对象,都具有可抛性
|--1 一般不可处理的:Error
特点:是由jvm抛出的严重性的问题(这种问题发生一般不针对性才处理,直接修改程序)。
|--2 可以处理的,Exception
(三)自定义异常:
在一个数组中,当调用者输入的参数为负数的时候,此时就会发生异常,如:
int[] arr=new int[3];
System.out.println(arr[-1]);
此时,JVM会抛出异常:java.lang.ArrayIndexOutOfBoundsException:-1。但是,很明显我们知道这个异常不属于角标越界。查看API文档,我们了解到负数角标异常在Java中并没有定义过。那么,最好就是自己定义异常了。
思路:按照Java异常的创建思想----面向对象,将负数角标进行自定义描述,并封装成对象。
友情提示:如果让一个类称之为异常类,必须要继承异常体系,因为只有称之为异常体系的子类才有资格具备可抛性,才可以被 两个关键字所操作:throws throw
classFuShuException extends Exception{
FuShuException(String message){
super(message);
}
}
class Demo{
public int method(int[] arr,int index)throws FuShuException{
if(index<0){
throw newFuShuException("角标变成负数了!");
}
return arr[index];
}
}
函数上声明异常,让对方在调用的时候就明确可能会发生的异常,关键字:throws
提醒:主函数要么捕捉要么抛出,最后交给JVM。
比较throws和throw之间的区别:
(1)throws使用在函数上,throw使用在函数内。
(2)throws后面跟的是异常类,可以跟多个,用逗号隔开;throw后跟的是异常对象。
(四)异常的分类
(1)编译时检测异常:在Exception及其子类中除了RuntimeException体系,这种异常在编译时就进行检测,可以进行针对性处理。
(2)编译时不检测异常,运行时异常:RuntimeException体系,这种异常的出现之后,运行就会强制停止,此时,只能在代码中进行修改。
(五)异常捕捉trycatch
(1)异常的处理格式:
try{
//需要被检测的代码
}
catch(异常类 变量){//该变量用于接收发送的异常对象
//处理异常的代码(处理方式);
}
finally{
//一定会执行的语句
}
(2)当出现多个异常情况时,这时我们就采用一个try对应多个catch这种形式。但是,需要注意的是父类的catch放在最下面,否则,编译失败。
catch(FuShuIndexException e){
System.out.println("处理角标为负数的情况");
}
catch(NullPointerExceptione){
System.out.println("处理空指向异常情况");
}
catch(Exceptione){
System.out.println("gameover!!!");
}
因为在执行语句发现并捕捉异常的时候,如果父类的异常在最上面,此时就会直接交给父类异常处理,那么执行语句中出现的特殊问题,就没有进行针对性处理。
(3)finally语句一定会执行的原因:比方说:当需要调用数据库的内容时,程序突然出现异常,此时,就需要finally语句进行关闭连接操作。当然,你也可以不使用finally,让数据库自己进行判断,但是,数据库判断是否连接使用资源是需要一定的时间的,此时,你仍然在占用资源。所以,finally通常用于关闭(释放)资源。
(六)总结:
(1)对于catch处理的异常我们最好就是尽量做到针对性处理
(2)catch与throws的使用,当功能的内容我们能解决的就使用catch。
解决不了,用throws告诉调用者,由调用者解决。
(3)当try和finally组合时,异常无法直接catch处理,但是需要关闭资源:
void show()throwsException
{
try{
throw new Exception();
}
finally{
}
}
此时,该show方法必须要抛出异常,因为只捕捉到异常,但是,并没有处理。
(4)异常的注意事项:
1,子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常
或者该异常的子类。
2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。
简单说:子类覆盖父类,只能抛出父类的异常或者子类或者子集
注意:如果父类的方法没有抛出异常,那么子类覆盖时,绝对不能抛,只能try。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------