黑马程序员_异常机制

------- 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不能抛。


练习:


view plaincopy
/*自定义异常。 
需求:在本程序中,对于除数是-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类。这样的话就可以直接用父类中已经定义好的方法了。
view plaincopy
/* 
有一个圆形和长方形。 
都可以获取面积。对于面积如果出现非法的数值,视为是获取面积出现问题。 
问题通过异常来表示。 
现有对这个程序进行基本设计。 
*/  
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();  
    }  
   
}  
   




 view plaincopy
/* 
毕老师用电脑上课。 
开始思考上课中出现的问题。 
比如问题是 
    电脑蓝屏。 
    电脑冒烟。 
要对问题进行描述,封装成对象。 
可是当冒烟发生后,出现讲课进度无法继续。 
出现了讲师的问题:课时计划无法完成。 
*/  
   
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培训、期待与您交流! ----------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值