黑马程序员_异常机制

------- android培训java培训、期待与您交流! ---------

一、异常:

是对问题的描述。将问题进行对象的封装。

异常体系:

         Throwable

                   |--Error

                   |--Exception

                            |--RuntimeException

 

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

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

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

throw和throws的用法:

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

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

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

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

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

异常有两种:

         编译时被检测异常

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

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

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

                   在编译时,不需要处理,编译器不检查。

                   该异常的发生,建议不处理,让程序停止。需要对代码进行修正。

异常处理语句:

try

{

         需要被检测的代码;

}

catch ()

{

         处理异常的代码;

}

finally

{

         一定会执行的代码;

}

 

有三个结合格式:

1.      try

         {

                  

         }

         catch()

         {

         }

 

2.      try

         {

                  

         }

         finally

         {

        

         }

 

 

3.      try

         {

                  

         }

         catch()

         {

         }

         finally

         {

        

         }

注意:

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

2,finally只有一种情况不会执行。当执行到System.exit(0);fianlly不会执行。

自定义异常:

         定义类继承Exception或者RuntimeException

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

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

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

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

         classMyException extends Exception

         {

                   MyException(Stringmessage)

                   {

                            super(message);

                   }

         }

 

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

异常的好处:

         1,将问题进行封装。

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

异常的处理原则:

         1,处理方式有两种:try 或者 throws。

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

                   一个try对应多个catch。

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

         4,catch内,需要定义针对性的处理方式。不要简单的定义printStackTrace,输出语句。

                   也不要不写。

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

                   try

                   {

                            thrownew AException();

                   }

                   catch(AException e)

                   {

                            throwe;

                   }

 

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

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

 

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

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

                   try

                   {

                            thrownew AException();

                   }

                   catch(AException e)

                   {

                            //对AException处理。

                            thrownew BException();

                   }

异常的注意事项:

         在子父类覆盖时:

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

         2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

练习:

/*自定义异常。
需求:在本程序中,对于除数是-1,也视为是错误的是无法进行运算的。
那么就需要对这个问题进行自定义的描述。*/
class Negative extends Exception
{
    Negative(String name)
    {
       super(name);
    }
}
class Demo
{
    int div(int a,int b) throws Negative
    {
    if(a<0)
        throw new Negative("出现负数了!");
    return a/b;
    }
 
}
public class ExceptionTest {
    public static void main(String[] args) {
       Demo d=new Demo();
       try {
           int num=d.div(4, 0);
           System.out.println(num);
       } catch (Exception  e) {
           System.out.println(e.toString());
       }
    }
}
总结:自定义异常要继承Exception类。这样的话就可以直接用父类中已经定义好的方法了。

/*
有一个圆形和长方形。
都可以获取面积。对于面积如果出现非法的数值,视为是获取面积出现问题。
问题通过异常来表示。
现有对这个程序进行基本设计。
*/
class NoValueException extends RuntimeException
{
    private String msg;
    NoValueException(String msg)
    {
       super(msg);
    }
}
interface Shape
{
    void GetArea();
}
class Cycle implements Shape
{
    private final double PI=3.14;
    private int r;
    Cycle(int r)
    {
       if(r<0)
           throw new NoValueException("非法值!");
       this.r=r;
    }
    public void GetArea()
    {
       System.out.println(r*r*PI);
    }
}
class Rectange
{
    private int h;
    private int w;
    Rectange(int h,int w)
    {
       if(h<0||w<0)
           throw new NoValueException("非法值!");
       this.h=h;
       this.w=w;
    }
    public void GetArea()
    {
       System.out.println(h*w);
    }
}
public class ExceptionTest3 {
    public static void main(String[] args) {
                
           Rectange r=new Rectange(2,3);
           r.GetArea();
           Cycle c=new Cycle(-3);
           c.GetArea();
    }
 
}
 


/*
毕老师用电脑上课。
开始思考上课中出现的问题。
比如问题是
    电脑蓝屏。
    电脑冒烟。
要对问题进行描述,封装成对象。
可是当冒烟发生后,出现讲课进度无法继续。
出现了讲师的问题:课时计划无法完成。
*/
 
class LanPingException extends Exception
{
    private String msg;
    LanPingException(String msg)
    {
       super(msg);
    }
}
class MaoYanException extends Exception
{
    private String msg;
    MaoYanException(String msg)
    {
      super(msg);
    }
}
class NoPlaneException extends Exception
{
    private String msg;
     NoPlaneException(Stringmsg)
     {
        super(msg);
     }
}
class Computer
{
    private int state=2;
   
   public void run()throws LanPingException ,MaoYanException
   {
              if(state==1)
           {
              throw new LanPingException("蓝屏了!");
           }
              if(state==2)
              {
                 throw new MaoYanException("冒烟了");
              }
       System.out.println("电脑运行!");
   }
   public void reset()
   {
       System.out.println("重启电脑!");
   }
}
 
class Teacher
{
    private String name;
    private Computer c;
    Teacher (String name)
    {
       this.name=name;
        c=new Computer();
    }
    public void teach()throws NoPlaneException
    {  
              try {
               c.run();
          } catch (LanPingException e) {
              // TODO: handleexception
               System.out.println(e.getMessage());
               c.reset();
           }catch(MaoYanException e)
           {
               test();
              throw new NoPlaneException("没法上课了"+e.getMessage());
           }
               
      
    }
    public void test()
    {
       System.out.println("练习");
      
    }
}
 
public class ExceptionTest2 {
 
    public static void main(String[] args) {
      
         Teacher t=new Teacher("xiaoming");
         try {
            t.teach();
       } catch (Exception e) {
           System.out.println(e.toString());
       }
       
       
    }
}
总结:注意的是当电脑冒烟这个异常发生时,因为电脑冒烟老师也处理不了,要转换成老师能够处理的异常,比如NoPlaneException异常。


-------- android培训java培训、期待与您交流! ----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值