异常类

作者: 安安静静写代码 | 来源:发表于2017-07-29 19:27 被阅读34次

    异常中的关键字
    1.throw 在方法内部,抛出异常对象
    2.throw 后面必须写new 对象,对象必须是异常的对象
    方法中声明关键字
    throws 在方法的声明声明上,表明此方法可能出现异常
    请调用者处理
    throws 后面必须写异常的类名
    调用了一个抛出异常方法调用者就必须处理
    不处理编译失败

    public class ExceptionDemo {
         public static void main(String args[]) throws Exception{
           
             int[] arr = null;
             int i = getArray(arr);
             System.out.println(i);
       }
         public static int getArray(int[] arr) throws Exception
         {
             //判断方法参数的合法性
             if(arr==null)
             {
                 //抛出异常的形式
                 //关键字throw
                 throw new Exception("传递数组不存在");
             }
             //判断数组是不是有元素
             if(arr.length==0)
             {
                 throw new Exception("数组中没有任何元素");
             }
             int i = arr[arr.length-1];
             return i*2;
         }
    }
    

    异常处理方式:
    try..catch..finally
    格式
    try{
    被检测的代码
    可能出现异常的代码
    }catch(异常类名变量){
    异常的处理
    }finally{
    必须要实行的代码
    }

    
    public class ExceptionDemo1 {
       public static void main(String args[])
       {
           int[] arr = new int[0];                     //throw new              NullPointerException("数组不存在");
           try{                               //try 检测到了有异常发生,捕获到一个异常对象,将异常抛给catch代码块处理这个异常
               
               int i = getArray(arr);
               System.out.println(i);
               
           }catch(NullPointerException ex) {    //throw new NullPointerException("数组不存在");
               System.out.println(ex);         //NullPointerException ex = new NullPointerException("数组不存在");
           }catch(ArrayIndexOutOfBoundsException ex){
               System.out.println(ex);
           }
           finally{
               System.out.println("Gome over");
           }
       }
    

    定义方法,抛出异常
    调用者使用try catch

    public static int getArray(int[] arr)throws NullPointerException,ArrayIndexOutOfBoundsException
        {
            //对数组判空
            if(arr==null)
            {
                //手动抛异常,抛出空指针异常
                throw new NullPointerException("数组不存在");
            }
            //对数组的索引进行判断
            if(arr.length<3) 
            {
                throw new ArrayIndexOutOfBoundsException("数组没有索引");
            }
            return arr[3]+1;
        }   
    }
    

    多catch写在一起
    细节
    catch小括号中写的是异常类名
    有没有顺序的概念,有
    平级异常:抛出的异常类之间,没有继承关系
    NullPointerException extends Exception
    NoSuchElementException extends Exception
    ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends Exception
    按等级从上往下级别越来越大,如果顺序相反则上面的父类会抓住下面所有子类的异常,那么下面的子类就没有用了

    import java.util.NoSuchElementException;
    import javax.naming.NameAlreadyBoundException;
    import javax.naming.NoPermissionException;
    public class ExceptionDemo2 {
    
       public static void main(String[] args) {
           
           try{
               
           }catch(NoSuchElementException ex){
               
           }catch(NullPointerException ex){
               
           }
    
       }
       public static void fun(int a)throws NullPointerException,NoSuchElementException {
           
            if(a==0)
            {
                throw new NullPointerException();
            }
            if(a==1)
            {
                throw new NoSuchElementException();
            }
       }
    }
    

    异常分为编译异常和运行时期异常
    编译异常:调出了抛出异常的方法,不处理编译失败(处理方式try throws)
    运行异常:抛出的异常是RuntimeException类,或者是他的子类
    运行异常的特点:
    方法内部抛出的是运行异常, new XXXException
    方法的声明上,不需要throws语句,调用者也不要要处理
    设计原因:运行异常,不能发生,但如果发生了,需要程序人员停止程序 修改源代码
    运行异常一旦发生,不要处理,请你修改源代码,运行异常一旦发生,后面代码没有执行意义

    public class Exceptiondemo3 {
             
        public static void main(String args[])
        {
            //fun();//此函数内时运行异常,不需要处理
            /*try{
                fun2();      //此函数抛出了异常,调用该函数时需要捕获异常
            }catch (Exception e) {
                
            }*/
            
            System.out.println(getArea(5));//测试正常的
            System.out.println(getArea(-1));//测试异常的
             
        }
        /*
         * 举个例子
         * 定义方法,计算圆形面积
         * 传递的值为0或者负数 计算的时候没有问题
         * 但是,违反了真实情况
         * 参数<= 0,停止程序,不要再计算了
         * */
        public static double getArea(double r)
        {
            if(r<=0)
                throw new RuntimeException("园形不存在");
            return r*r*Math.PI;
        }
        
        public static void fun()  //运行时异常,不需要用throws抛出异常
        { 
            
                throw new RuntimeException("运行时异常");
            
        }
        
        public static void fun2() throws Exception //编译时异常,需要抛出异常
        {
            
                throw new Exception("运行时异常");
            
        }
        
    }
    

    结论 :
    父类的方法,如果抛出异常,子类重写后可以不抛异常
    亦可以抛异常,但是,如果子类再抛异常,抛出的异常不能大于父类的 异常
    大于是指继承关系,父类和子类抛出的异常是平行关系也不行
    父类不抛,子类不能抛,如果子类调用了抛异常的方法只能自己用try..catch处理

    public class ExceptionDemo4 {
             public static void main(String args[])
             {
                 
             }
    }
    class fu{
       public void function(){
           
       }
    }
    class zi extends fu {
       public void function()
       {
           try {                     
               math();                      //子类调用了抛出异常的math方法,但是由于子类继承的父类没有抛出异常,所以子类也不能抛只能自己用try..catch 处理
           } catch (Exception e) {         
               e.printStackTrace();
           }
       }
       public static void math()throws Exception
       {
           throw new Exception();
       }
    }
    

    /*

    • Throwable 类中的方法
    • 三个方法,都和异常的信息有关系
    • String getMessage() 对异常信息的描述
    • String toString() 对异常信息的简短描述
    • void printStackTrace() 将异常信息追踪到标准错误刘
    • 传递成绩计算成绩平均数

    */

    public class ExceptionDemo5 {
         public static void main()
         {  
             try {
                 int ang = getAvg(50,60,-19,57);
    
            } catch (FuShuException e) {
                  e.printStackTrace();
            }
             
         }
         public static int getAvg(int...source) 
         {
             int sum = 0;
             for(int s:source)
             {
                 if(s<0)
                 {
                     throw new FuShuException("异常了!");
                 }
                 sum+=s;
             }
             return sum/source.length;
         }
    }
    /*
     *  自定义异常
     *  继承Exception或者继承RuntimeException
     *  调用父类构造方法将字符串传给父类
     */ 
     class FuShuException extends RuntimeException{
         public FuShuException(String s)   
         {
             super(s);
         }
         public FuShuException()//无参的构造方法
         {
             
         }
     }
    
    

    相关文章

      网友评论

          本文标题:异常类

          本文链接:https://www.haomeiwen.com/subject/pcsclxtx.html