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


----------------------  黑马程序员 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值