• java===Exception异常处理


    package cn.china;
    /**
     * 异常:在运行时期发生的不正常情况。
     * 问题很多,意味着描述的类也很多,
     * 将其共性进行向上抽取,形成异常体系。
     * 最终问题就分成两大类:
     * throwable:无论是Error,还是异常,都是问题,就应该可以抛出,让调用者知道并处理。
     * 该体系的特点就在于throwable及其所有子类都具有可抛性。
     * 如何体现可抛性?
     * 其实是通过两个关键字体现的,throws,throw;凡是可以被这两个关键字操作的类和对象都具有可抛性。
     *    1、一般不可处理的,Error
     *    特点:是由JVM抛出的严重性问题,已经影响到我们程序的执行;这种问题发生一般不针对性处理,直接修改程序
     *    2、可以处理的,Exception
     *     特点:子类的后缀名都是用其父类名作为后缀,阅读性很强。
     *     
     *     异常分类:
     *     1、编译时被检测异常:只要是Exception和其子类都是,除了RunTimeException和其子类
     *     这种问题一旦出现,希望在编译时就进行检测,让这种问题有对应的处理方式。
     *     这样的问题都可以针对性的处理
     *     2、编译时不检测异常(运行时异常):RunTimeException和其子类。
     *     这样的问题的发生,无法让功能继续,运算无法进行,更多是因为调用的原因导致的或者引发了内部状态的改变导致的。
     *     这种问题一般不处理,直接编译通过,在运行时,让调用者调用时的程序强制停止,让调用者对代码进行调整。
     *     
     *     throw 和 throws区别?
     *     throws 使用在函数上  抛出的是异常类,可以抛出多个可以用逗号隔开
     *     throw 使用在函数内   抛出的是异常对象*/
    class FuShuIndexException extends Exception//所以这里可以继承RunTimeException,就不需要声明或者捕捉异常,编译不会失败
    {
        public FuShuIndexException(String meg) {
            super(meg);
            // TODO Auto-generated constructor stub
        }
    }
    class D{
        public int method(int arr[],int index)throws FuShuIndexException
        {
            if(arr==null)
                throw new NullPointerException("数组的引用不能为空!");
            if(index>=arr.length)
                throw new ArrayIndexOutOfBoundsException("数组越界了!"+index);
            if(index<0)//准备用负数角标异常来表示,但是这种异常在java中并没有定义过。按照java异常的创建思想,将负数角标进行自定义描述,并封装成对象
                throw new FuShuIndexException("数组的角标不能为负数"+index);
            return arr[index];
        }
    }
    public class Demo {
    
        public static void main(String[] args) throws FuShuIndexException
        {
            int[]arr=new int[3];
            D d=new D();
            int num= d.method(arr, -30);
           
        }
        
    
    }
    package cn.china;
    /**异常处理的捕捉形式
     * 具体格式:
     * try
     * {需要被检测异常的代码}
     * catch(异常类  变量)  //该变量用于接收发生异常的对象
     * {处理异常的代码}
     * finally
     * {一定会被执行的代码}
     * 
     * 
     * 异常处理原则:
     * 1、函数内部如果抛出需要检测的异常,那么函数上必须要声明,否则必须在函数内必须要用trycatch捕捉,否则编译失败。
     * 2、如果调用到了声明异常的函数,要么trycatch要么throws,否则编译失败。
     * 3、什么时候catch,什么时候throws呢?
     * 功能内部可以解决,用catch;
     * 解决不了用throws,告诉调用者,调用者解决;
     * 4、一个功能如果抛出多个异常,那么调用时必须由对应多个catch进行针对性处理。
     * 内部有几个要检测的异常,就抛几个异常,抛出几个,就catch几个;*/
    class FuShuIndexException extends Exception//所以这里可以继承RunTimeException,就不需要声明或者捕捉异常,编译不会失败
    {
        public FuShuIndexException(String meg) {
            super(meg);
        }
    }
    class C{
        public int method(int arr[],int index)throws FuShuIndexException
        {
            if(arr==null)
                throw new NullPointerException("数组的引用不能为空!");
            if(index>=arr.length)
                throw new ArrayIndexOutOfBoundsException("数组越界了!"+index);
            if(index<0)//准备用负数角标异常来表示,但是这种异常在java中并没有定义过。按照java异常的创建思想,将负数角标进行自定义描述,并封装成对象
                throw new FuShuIndexException("数组的角标不能为负数"+index);
            return arr[index];
        }
    }
    public class Demo1 {
    
        public static void main(String[] args) {
            int[]arr=new int[3];
            C c=new C();
            try
            {
            int num= c.method(arr, -30);
            System.out.println("num"+num);//num是局部变量 所以这两句话要放在同一个代码块
            }
            catch(NullPointerException e){//多catch格式
                e.printStackTrace();
            }
            catch(ArrayIndexOutOfBoundsException e){
                e.printStackTrace();
            }
            catch(FuShuIndexException e)
            {
                e.printStackTrace();//JVM默认的异常处理机制就是调用异常对象的这个方法。
                System.out.println("Message"+e.getMessage());
                System.out.println("String"+e.toString());
                System.out.println("负数角标异常!");
            }
            catch(Exception e){//父类需要放在最下面,不然编译失败,因为Exception跟所有异常都匹配,
                e.printStackTrace();
            }
            System.out.println("over!");
    
        }
    
    }
    package cn.china;
    /**try  catch  finally 组合特点
     * 1、 try  catch  finally
     * 2、try  catch(多个当没有必要资源需要释放时,可以不用定义finally)
     * 3、 try  finally
     * 例:void show()throws Exception //因为没有catch所以必须声明异常
     * {
     *  try{
     *  //开启资源
     *  throw new Exception
     *  }
     *  finally{
     *  //关闭资源
     *  }
     * }*/
    class E{
        public int method(int  index)
        {
            int[]arr=new int[3];
            if(index>=arr.length)
                throw new ArrayIndexOutOfBoundsException();
            return arr[index];
        }
    }
    public class Demo2 {
    
        public static void main(String[] args) {
            E e=new E();
            try{int num=e.method(3);
            System.out.println(num);
            }catch(ArrayIndexOutOfBoundsException c)
            {
                System.out.println(c.toString());
                return;
                //System.exit(0); 退出JVM只有这种情况不会执行finally语句;
            }
            finally {//一定会被执行的语句,主要用于关闭或者释放资源
                System.out.println("finally");
            }
            System.out.println("over!");
    
        }
    
    }
    package cn.china;
    
    import java.time.format.TextStyle;
    
    /**
     * 毕老师用电脑上课,
     * 分析其中问题:
     * 电脑蓝屏,冒烟*/
    class LanPingException extends Exception
    {
        LanPingException(String msg){
            super(msg);
        }
    }
    class MaoYanException extends Exception
    {
        MaoYanException(String msg){
            super(msg);
        }
    }
    class NoPlanException extends Exception{
        NoPlanException(String msg){
            super(msg);
        }
    }
    class Computer{
        private int state=0;
        public void run()throws LanPingException,MaoYanException
        {
            if(state==1)
              throw new LanPingException("蓝屏啦");
            if(state==2)
                throw new MaoYanException("电脑冒烟了");
            System.out.println("电脑运行");
        }
        public void reset(){
            state=0;
            System.out.println("电脑重启了");
        }
    }
    class Teacher{
        private String  name;
        private Computer comp;
        Teacher(String name){
            this.name=name;
            comp=new Computer();
        }
        public void prelect()throws NoPlanException
        {
            try
            {
                comp.run();
                System.out.println("讲课");
            }catch(LanPingException e){
                System.out.println(e.toString());
                comp.reset();
                prelect();
            }catch(MaoYanException e){
                System.out.println(e.toString());
                test();
                throw new NoPlanException("课时无法进行"+e.getMessage());
                //可以对电脑进行维修
                //throw e;
            }
        }
        public void test(){
            System.out.println("大家练习");
        }
    }
    public class Demo3 {
    
        public static void main(String[] args) {
            Teacher teacher=new Teacher("毕老师");
            try
            {
                teacher.prelect();
            }
            catch(NoPlanException e)
            {
                System.out.println(e.toString()+"......");
                System.out.println("换人");
            }
    
    
        }
    
    }
    /**
     * class NoAddException extends Exception{}
     * void addData(Data d)throws NoAddException
     * {
     *    链接数据库
     *    try{
     *    添加数据库,出现异常 SQLException();
     *    }catch(SQLException e)
     *    {
     *        //处理代码
     *        throw new NoAddException();
     *    }finally
     *    {
     *         
     *    关闭数据库
     *    }
     * }*/
     
    package cn.china;
    /**异常的注意事项
     * 1、子类在覆盖父类方法时如果父类的方法抛出异常,那么子类的方法只能破案出父类的异常,或者该异常的子类
     * 2、如果父类抛出多个异常,那么子类子还能抛出父类异常的子集
     * 
     * 简单说:子类覆盖父类,只能抛出父类的异常,或者子集;如果父类没有抛出异常,那么子类覆盖时绝对不能抛出异常,但是可以用try;*/
    class A extends Exception 
    {
    }
    class B extends A
    {}
    class C extends Exception
    {}
    class Fu{
        void show()throws A{}
    }
    class Zi extends Fu{
        void show()throws B{}//只能抛出A或者B 
    }
    class Test{
        void method(Fu f){
            try{
                f.show();
            }catch(A a){}
        }
    }
    public class Demo4 {
    
        public static void main(String[] args) {
            Test t=new Test();
            t.method(new Zi());
    
        }
    
    }
  • 相关阅读:
    斜率dp+cdq分治
    踢罐子 [几何+乱搞]
    [HDU3710] Battle Over Cities [树链剖分+线段树+并查集+kruskal+思维]
    [xsy1129] flow [树链剖分和线段树一起优化网络流][我也不知道这是什么鬼标签]
    [CF666E] Forensic Examination [广义后缀自动机+线段树合并]
    省选算法学习-BSGS与exBSGS与二次剩余
    省选算法学习-回文自动机 && 回文树
    省选算法学习-后缀数组+后缀自动机+后缀树
    Password [分块]
    随机过程——泊松过程
  • 原文地址:https://www.cnblogs.com/wangyinxu/p/6575747.html
Copyright © 2020-2023  润新知