黑马程序员---java基础------------------异常体系

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

    分类:Error;Exception   

    异常的处理:常见的操作e.getmessage()、e.toString()、e.printStackTrace()

      java 提供了特有的语句进行处理:

         try {  

            需要被检测的代码;

           } catch(异常类 变量) {

              处理异常的代码;(处理方式) //这边要是有retur语句后面将不被执行

          } finally {  

            一定会执行的语句; 当执行到System.exit(0);fianlly不会执行。

          }

    异常的申明:

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

      对方声明几个异常,就对应有几个catch块。不要定义多余的catch。 这里需要注意的是如果其中一个异常申明的是父类的异常(Exception e)异常,呢么它一定要放在最后面,否则的话定义的其他异常将不能被运行。

    自定义异常:

      异常的好处:将问题进行了封装;     将正常流程代码和问题处理代码相分离,方便与阅读。

class FuShuException extends Exception //getMessage(); {                            这就是自定义了一个异常。

     //private int value;

     //FuShuException()  {  

     //  super();  

    //}

     FuShuException(String msg,int value)  

    {                                             这边是在定义异常信息,父类已经对异常信息做过处理,子类直接通过super(msg);方法获取自定义的异常信息

      super(msg);  

       this.value = value;   //这里可以把异常的数字也打印出来

     }

     public int getValue()  {  

       return value;

     }

}

      

class Demo {

     int div(int a,int b)throws FuShuException  {  //函数内部抛出了一个自定义的异常,在函数上要申明一下

       if(b<0)   

         throw new FuShuException("出现了除数是负数的情况------ / by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。

        return a/b;  

     }

}

class  ExceptionDemo3 {  

    public static void main(String[] args)  {  

         Demo d = new Demo();   

         try   {    

            int x = d.div(4,-9);    

            System.out.println("x="+x);    

         }   catch (FuShuException e)   {    

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

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

            System.out.println("错误的负数是:"+e.getValue());   

        }      

          System.out.println("over");

     }

}

    继承Exception的原因:异常体系有一个特点,因为异常和异常对象都不抛出,他们都具备可抛性,这个可抛性是throuable这个体系中的独有特点,只有这个体系中的类和对象才可以被throw和throws操作。

    throws和throw的区别:

        throws使用在函数上;throw后跟的是异常对象。

        throw使用在函数内;throws后面跟的异常类。可以跟多个。用逗号隔开。

    RuntimeException 运行时异常

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

明,是因为不需要让调用者处理。当该异常发生,希望程序停止。因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。

        自定义异常时:如果该异常的发生,无法在继续进行运算,就让自定义异常继承RuntimeException。

 

class LanPingException extends Exception {  

    LanPingException(String message)  {   

        super(message);  

    }

}

class MaoYanException extends Exception {

     MaoYanException(String message)  {   

        super(message);  

    }

}

class NoPlanException extends Exception {  

     NoPlanException(String msg)  {  

         super(msg);  

     }

}

class Computer {  

    private int state = 3;  

    public void run()throws LanPingException,MaoYanException  {  

         if(state==2)    

            throw new LanPingException("蓝屏了");   

        if(state==3)    

            throw new MaoYanException("冒烟了");

          System.out.println("电脑运行");  

    }  

    public void reset()  {  

         state = 1;   

        System.out.println("电脑重启");   

     }

}

class Teacher {  

    private String name;  

    private Computer cmpt;

     Teacher(String name)  {   

        this.name = name;   

        cmpt = new Computer();

     }

     public void prelect()throws NoPlanException  {  

         try   {    

            cmpt.run();      

        }   catch (LanPingException e)   {   

             cmpt.reset();   

        }   catch (MaoYanException e)   {       

             test();    

             throw new NoPlanException("课时无法继续"+e.getMessage());      

         }  

         System.out.println("讲课");  

     }  

     public void test()  {   

        System.out.println("练习");  

     }

}

class ExceptionTest
{
     public static void main(String[] args)
     {
          Teacher t = new Teacher("毕老师");
          try
          {
               t.prelect();
          }
          catch (NoPlanException e)
          {
               System.out.println(e.toString());
               System.out.println("换老师或者放假");
          }
     }
}

    

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

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

                (父类已经有问题,子类要继承父类的功能,不能比父类更有问题,只能更优化

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

            3)如果父类接口的方法中没有抛出异常,那么子类在覆盖方法时也不可以抛出,只能try,绝对不能抛


  包(package):

      对类进行分类管理;给类提供多层命名空间;写在程序第一行;类的全名是:包名.类名;包也是一种封装,建包可以将源文件和类文件分离。算是一种加密,保护

       源代码被偷窥。

      包与包之间可以使用的权限,只有public和protected两种。

                                       public                   protected               default                private

                                  同一个类中            ok                                                 ok                                           ok                                           ok

 

                                  同一个包中            ok                                                  ok                                           ok

 

                                       子类                 ok                                                 ok            

 

                                     不同包中             ok

       导包:使用import关键字

      

posted @ 2013-05-24 17:52  zhao198627  阅读(133)  评论(0编辑  收藏  举报