黑马程序员--异 常

来源:互联网 发布:大数据感知技术 编辑:程序博客网 时间:2024/05/01 04:56

----------------------- 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及其所有的子类都具有可抛性

          //可抛性是通过两个关键字来体现的:

           throwsthrow,凡是可以被这两个关键字所操作的类和对象,都具有可抛性

           |--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

比较throwsthrow之间的区别:

1throws使用在函数上,throw使用在函数内。

2throws后面跟的是异常类,可以跟多个,用逗号隔开;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!!!");

              }

因为在执行语句发现并捕捉异常的时候,如果父类的异常在最上面,此时就会直接交给父类异常处理,那么执行语句中出现的特殊问题,就没有进行针对性处理。

3finally语句一定会执行的原因:比方说:当需要调用数据库的内容时,程序突然出现异常,此时,就需要finally语句进行关闭连接操作。当然,你也可以不使用finally,让数据库自己进行判断,但是,数据库判断是否连接使用资源是需要一定的时间的,此时,你仍然在占用资源。所以,finally通常用于关闭(释放)资源。

(六)总结:

1)对于catch处理的异常我们最好就是尽量做到针对性处理

2catchthrows的使用,当功能的内容我们能解决的就使用catch

解决不了,用throws告诉调用者,由调用者解决。

3)当tryfinally组合时,异常无法直接catch处理,但是需要关闭资源:

void show()throwsException

              {

                     try{

                            throw new Exception();

                     }

                     finally{

                     }

              }

此时,该show方法必须要抛出异常,因为只捕捉到异常,但是,并没有处理。

4)异常的注意事项:

1,子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常

或者该异常的子类。

2,如果父类抛出多个异常,那么子类只能抛出父类异常的子集。

简单说:子类覆盖父类,只能抛出父类的异常或者子类或者子集

注意:如果父类的方法没有抛出异常,那么子类覆盖时,绝对不能抛,只能try

 

----------------------- android培训java培训java学习型技术博客、期待与您交流! ----------------------

 

原创粉丝点击