代码改变世界

黑马程序员-异常

2014-06-06 18:28  黑马程序员*  阅读(123)  评论(0)    收藏  举报

异常总结

1.异常;就是程序运行时出现的不正常情况

异常的由来;问题也是现实生活中的一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象。其实就是java对不正常情况进行描述后的对象体现

严重的;java通过Error类进行描述

                     一般不编写针对性的代码进行处理

非严重的;java通过Exception类行进描述

                     对于Exception可以使用针对性的处理方式进行处理。

异常体系:

       throwable

              |--Error

              |--Exception

                     |--RuntimeException

异常体系的特点;异常体系中所有类以及建立的对象都具备可抛性

                            也就是说可以被throw和throws关键字所操作。

                            只有异常体系具备这个特点。

throw和throws的用法区别;

throw定义在函数内,用于抛出异常对象。

throws定义在函数上,用于抛出异常类,可以抛出多个,用逗号隔开。

当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败。

注意,RuntimeException除外,也就是说,函数内如果抛出RuntimeException异常,函数上可以不用声明。

如果函数声明了异常,调用者需要进行处理,处理方法可以throws,可以try

异常有两种:

       编译时被检测异常

              该异常在编译时,如果没有处理(也就是没有抛没有try),编译失败。

              该异常被标识,表示可以被处理。

       运行时异常(编译时不检测)

              在编译时,不需要处理,编译器不检查,RuntimeException以及其子类。

三种结合方式

1.

try

{    

}

catch ()

{

}

2.

try

{

 

      

}

catch ()

{

}

catch()

{

}

3.try

{    

}

finally

{

}

注意;

1.finally中定义的通常是 关闭资源代码。因为资源必须要被释放

2.只有一种情况finally读不到,在final前面,调用System.exit(0)(系统退出,jvm结束)

自定义异常;

       定义的类继承Exception或者RuntimeException

       1.为了该自定义异常具备可抛性

       2.让该类具备异常的共性方法。

       当要定义自定义异常的信息时,可以使用父类已经定义好的功能。

       将异常信息传递给父类的构造函数。

       class myException extends Exception{

              myException(String message){

                     super(message);

              }

       }

自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装。

异常的好处:

       1.将问题进行封装

       2.将正常流程代码和问题代码相分离,方便阅读。

异常的处理原则:

       1.处理方式两种:try或throws

       2.调用到抛出异常的功能时,抛几个,处理几个。

              一个try可以对应几个catch

       3.多个catch,父类catch放到最下面。

       4.catch内,需要定义针对性的处理方式,不要什么都不写。

              当捕获的异常,本功能处理不了时,可以在catch中继续抛。

       try   {

              throw new AException();

       }

       catch (AException e){

              throw e//函数内throw

       }

       //如上传信息失败(服务器原因AException),将上传失败传给用户(BException)

       如果该异常处理不了,但是并不属于该功能出现的异常。

       可以将异常转换后,在抛出和该功能相关的异常。      

       或者异常可以处理,当需要将异常产生和本功能相关的问题提供出去,

       让调用者知道,并处理。也可以将捕获异常处理后,转换新的异常。

       try   {

              throw AException

       }

       catch (AException e)

       {//如转账,出现问题

              1.先对AException处理 ;将出现转账的问题解决,如将前退回用户。

              2.thro new BException:告知用户转账失败。

       }

RuntimeException 

Exception中有一个特殊的子类异常RuntimeException

如果在函数中抛出该异常,函数上可以不用声明,编译一样通过

如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。

之所以不用再函数上声明,是因为不需要让调用者处理(用户?)。

当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,

希望停止程序后,程序员对代码进行修正。

自定义Runtime异常;如果该异常的发生,无法在继续进行运算,

       就让自定义异常继承RuntimeExeption.;例如;负数异常

异常的注意事项:

       在子类覆盖时:

       1.子类抛出的异常必须是父类异常的子类或子集。

       2.如果父类或借口没有抛异常,子类在覆盖时,只能try不能抛。

 记住一点;catch是用于处理异常的,没有catch就代表异常没有被处理过,

       如果该异常是检测(非runtime及其子类?)时的异常,那么必须声明

public void method(){

       链接数据库;

       try{       

       }

       catch (){

              数据操作;、

              //throw new Exception(),如果用户操作时数据库发生异常,

              //不可以将这个异常抛给用户(因为这是程序员的事情,用户处理不了),我们要抛给用户一个用户可以处理的异常

              //如查找的信息不存在。这个用户可以处理的异常必须要抛,要让用户知道发生社么。

       }

       关闭数据;//该动作,无论数据操作是否成功,一定要关闭

       }

 异常在子父类覆盖中的体现;

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

 2.如果父类方法抛出多个异常(ABCD),那么子类在覆盖该方法时,只能抛出父类异常的子集(<=ABCD)也可以自己处理。

 3.如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,不可以抛出异常。

       如果子类方法发生了异常,就必须要进行try处理,绝对不可以抛。

1.为什么子类的异常是父类或父类的子类?

如果父类抛了异常,别的类在调用该类的时候(show()),进行了try,catch处理。若子类在抛了

一个不是父类体系的异常,那多利用多态将子类传给show()时,异常无法处理。

//异常比if判断的好处,将正常代码于异常分离开来。 

class fushuException extends Exception{

       //自定义异常信息

       private int value //获取异常的数值(负数)

       private String msg;//这需要定义吗?????????,定义成员变量,给全局用。

       fushuException(String msg){//构造函数不需要写返回值 

              this.msg= msg;

              //super(msg)一条就够,定义在构造函数里

       }

       public String getMessage(){//覆盖getMessage()方法 

              return msg ;

              }

       }

class demo{

       int div(int a,int b)throws fushuException{

              if (b<0){

                      throw new fushuException("出现了负数的情况。。。by/fushu");//手动通过throw关键字抛出一个自定义异常,函数内出现异常,函数上必须声明

               }

              return a/b;

       }

}

class  day0909{

       public static void main(String[] args){//throws Exception//在主函数上抛 抛给虚拟机

              demo d = new demo();

              try   {

                     int x = d.div(4,-1);//div是用户输入的入口,要么捕捉,要么抛

                     System.out.println(x);

              }

              catch (fushuException e ){//抛什么处理什么            

                     System.out.println(e.getMessage());

                     System.out.println("出现负数了");

              }                  

              System.out.println("over");

       }

}  

 /*练习:

毕老师上课

问题;

电脑蓝屏

电脑冒烟

要对问题进行描述,封装对象

可是当冒烟发生后,出现讲课进度无法继续。

出现了讲师的问题:课时计划无法完成。也要描述