黑马程序员Java面向对象——异常

来源:互联网 发布:linux nc 测试端口 编辑:程序博客网 时间:2024/05/22 00:37


---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------

 

¥异常

异常就是在程序运行时出现不正常情况。

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

       其实就是java对不正常情况进行描述后的对象体现。

       异常将正常的代码和问题处理代码分离。方便于阅读。

       对于问题的划分,两种:一种是严重的问题,一种非严重的问题。

       对于严重的,java通过Error类进行描述。

       对于error一般不编写针对性的代码对其进行处理。

       对于非严重的,java通过Exception类进行描述。

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

       无论error 或者exception都具有一些共性内容。

       比如:不正常情况的信息,引发原因等。

 

异常体系:

       Throwable

              |-------Error

              |-------Exception

                            |-------RuntimeException

                            简单写了基本还有好多·····



2          异常的处理。

 Java提供了特有的语句进行处理。

格式1:

Try

{

需要被检测的代码;

}

Catch(异常类 变量)

{

处理异常的代码:(处理方式)

}

Finally

{

一定会执行的语句

}

格式2:

Try

{

需要被检测的代码;

}

Catch(异常类 变量)

{

处理异常的代码:(处理方式)

}

格式3:

Try

{

需要被检测的代码;

}

Finally

{

一定会执行的语句

}

//记住:catch是用于处理异常,如果没有catch就代表异常没有没处理掉,如果该异常是检测异常要声明。

例题:

class Demo{               int dvs(int a ,intb){              return a/b;}}class ExceptionDemo {       public static void main(String[] args) {              /*最开始的语句              Demo d =newDemo();              intx=d.dvs(4,0);              System.out.println("x="+x);*/              Demo d= new Demo();              try{              int x=d.dvs(4,0);              System.out.println("x="+x);                                  }              catch (Exception A)              {                     System.out.println("除数不为0");                     System.out.println(A.getMessage());//  / by zero;                     System.out.println(A.toString());//异常名称:异常信息。                     A.printStackTrace();//异常名称,异常信息。异常出现的位置。                                         //其实JVM异常处理机制默认就是printStackTrace方法                                         //打印异常的堆栈的跟踪信息。              }




3. 对捕获到的异常对象进行常见方法操作。

       getMessage();//获取异常的信息。

       toString();//异常名称:异常信息。

        printStackTrace();//异常名称,异常信息。异常出现的位置。

                                      //其实JVM异常处理机制默认就是printStackTrace方法

                                   //打印异常的堆栈的跟踪信息。

在函数上声明异常。便于提高安全性,让调用出进行处理,不处理编译失败。

 

对多异常的处理

 

1 声明异常时,建议声明为具体的异常,这样处理的可以更有针对性。

如例句:

              int Div(int a,intb)throws ArithmeticException, ArrayIndexOutOfBoundsException//  在功能上通过throws的关键字声明该功能有可能出现问题。

2. 对方声明几个异常,就对应有几个catch块。如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面。       

 

建议在进行catch处理时,catch一定要定义具体处理方式,不要简单定义一句e.printStackTrace(),也不要简单的书写一条输出语句。

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

try

{

       throw newAException();

}

catch(AExeception a)

{

       throw a;

}

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

可以将异常转换后,再抛出和该功能相当异常。

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

当调用者知道,并处理,也可以将捕获异常处理后,转换新的异常。如下例题

try

{

 

       throw new  AException();

}

catch (AException a)

{

       throw new BException();

}

比如银行转账例子


自定义异常 

1           当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。

              要么在内部try catch处理。

              要么在函数上声明让调用者处理。

              简明一句话:一般情况下,函数内出现异常,函数上需要声明。

2 自定义异常:

                      必须是自定义类继承Exception。或者RuntimeException

                     1为了让该自定义类具备可抛性。

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

 

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

              classMyException excends Exception

              {

                     MyException(String message)

                     {

                            super(message);

                     }

              }



继承Exception原因:

异常体系有一个特点:因为异常类和异常对象需要被抛出。

他么都具备可抛性。这个可抛性是Throwable这个体系中独有特点。

只有这个体系中的类和对象才可以被throw和throws操作。

3             throws和throw的区别

                                                    throws使用在函数上

                                                    throw使用在函数内

                                                   throws后面跟的是异常类,可以跟多个,用逗号隔开

                                                   throw后面跟的是异常对象。  

  注意:throw单独执行对象完毕,后面不要再加语句。因为执行不到。就像return后面不加语句一样。

 

 

 

RuntimeExceptiony异常

 

1              Exception中有一个特殊的子类异常RuntimeException运行时异常。

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

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

 

2             之所以不用在函数声明,是因为不需要让调用者处理。

当该异常发生,希望程序停止,因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

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

就让自定义异常继承RuntimeException。

4            对于异常分两种:

(1)编译时被检测的异常。

(2)编译时不被检测的异常(运行时异常,RuntimeException以及其子类)

// 下面为另外一个RuntimeException例子

class FuShuException extends RuntimeException{              FuShuException(String message){              super(message);       }}class Demo{         int Div(int a,int b){                           if(b<0)                      throw new FuShuException("出现了除数为负数");               if(b==0)                      throw new ArithmeticException("被零整除啦");               return a/b;       }}class  ExceptionDemo5{       public static void main(String[] args) {              Demo d = new Demo();                            int x = d.Div(4,-1);                     System.out.println(x);       }} 


 

 

Finally最终都会执行的语句(一定要记住这条哦)

假设:

       class NoException

       {

      

      } 

public void method()throws NoEception

{

       连接数据库;

       数据操作://shrow new SQLException();

       关闭数据库://该动作,无论数据操作是否成功,一定要关闭资源。

}

try

{

连接数据库;

       数据操作:

}

catch(SQlEception a)

{

       会对数据库进行一次处理;

throw new NoException();

//抛出对外暴露可以识别的另外一个错误.

//比方说外部的销售科员要拿货这里的catch是仓

//库员处理的内容,他要处理货物的事情,因为销//售员只要知道有没有货,其他不是他的工作范

//围,那么catch仓库员就只抛出一个问题:就是

//告知销售员没货的问题就可以了。这就叫问题的封装                            

}

finally

{

关闭数据库

}

Finally代码块:定义一定执行的代码。通常用于关闭资源。

一种情况会执行不到就是在catch语句中定义了

System.exit(0); //属于系统退出。执行不到finally

 

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


1, 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。或者不抛。(只延续父类或者有关父类的zi问题。)

2, 如果父类抛出多个异常,那么子类在覆盖方法时,只能抛出父类异常的子集。(只要父类有)

3,   如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时也不可以抛出异常,     日过子类方法发生了异常,就必须得try啦。决定不能抛。

 

应用题:

/*有一个圆形和长方形,都可以获取面积,对于面积如果出现非法的数值,视为是获取面积出现问题。问题用异常表示现在对这个程序进行基本设计*/ class NovalueException extends RuntimeException//原本继承Exception{       NovalueException(Stringmessage){              super(message);       } } interface Shape{       void getArea();} class Rec implements Shape       {              private intlen,wid;              Rec(int len,intwid)//throws NovalueException//throws NovalueException之前没有RuntimeException需要加的              {                     if(len<=0|| wid<=0)                            thrownew NovalueException("非法数值");                     this.len=len;                     this.wid=wid;        }       public void getArea()       {              System.out.println(len*wid);       }}class Circle implements Shape{       private int radius;       public static finaldouble PI =3.14;       Circle(int radius)       {              if(radius<=0)                     throw      new NovalueException("数值非法");//RuntimeException("数值非法");不如自定义的好              this.radius =radius;        }       public void getArea()       {              System.out.println(radius*radius*PI);       }}class ExceptionDemo{        public static voidmain(String[] args) {              /*最开始的句子              try              {                     Recr=new Rec(2,5);                     r.getArea();              }              catch(NovalueException a)              {                     System.out.println(a.toString());              }              */                      Rec r=new Rec(2,5);                      r.getArea();                      Circle c=new Circle(-6);                      c.getArea();                      System.out.println("程序结束");                           }}


      

---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------

 

0 0
原创粉丝点击