美文网首页
Java异常学习

Java异常学习

作者: 浮桥小麦 | 来源:发表于2017-06-20 14:16 被阅读26次
    NO.1 简单异常演示
    public static void main (String[] args) {
            //Java异常学习--Exception
            /**
             * * A:JVM默认是如何处理异常的
             * main函数收到这个问题时,有两种处理方式:
             * a:自己将该问题处理,然后继续运行
             * b:自己没有针对的处理方式,只有交给调用main的jvm来处理
             * jvm有一个默认的异常处理机制,就将该异常进行处理.
             * 并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行
             * B:案例演示
             * JVM默认如何处理异常
             */
    
         Demo3 d = new Demo3();
        // int x = d.div(10,2);
       //这样正常调用是没问题的
            int x = d.div(10,0);
            //我们让除数为0.就会抛出异常
            System.out.println(x);//java.lang.ArithmeticException
           //以后我们看错误从后往前看,先来到出错的每一行,最后看运行时异常
        }
    
    }
    class  Demo3 {
        public int div(int a, int b) {
            return a / b;
        }
    }
    
    
    NO.2 异常处理的方式
    #第一种
    public static void main (String[] args) {
            /**
             * * A:异常处理的两种方式
             * a:try⋯catch⋯finally
             * try catch
             * try catch finally
             * try finally 
             * b:throws
             * B:try...catch处理异常的基本格式
             * try⋯catch⋯finally
             * C:案例演示
             * try...catch的方式处理1个异常
    
             try:用来检测异常的
             catch:用来捕获异常的
             finally:释放资源
    
             世界上最真情的相依就是你在try我在catch,无论你发神马脾气,我都静静接受,默默处理
             当通过trycatch将问题处理了,程序会继续执行
             */
          
                Demo2 d = new Demo2();
                try{
                    int x = d.div(10, 0);
                    System.out.println(x);
                }catch(ArithmeticException a) {     //ArithmeticException a = new ArithmeticException();
                    System.out.println("出错了,除数为零了");
                }
                  //我们经过主动异常处理,就可以继续执行程序了
                  System.out.println("1111111111111111");
            }
    
        }
        class Demo2 {
            /*
             * 除法运算
             */
            public int div(int a,int b) {       //a = 10,b = 0
                return a / b;                   // 10 / 0  被除数是10,除数是0当除数是0的时候违背了算数运算法则,抛出异常
                //new ArithmeticException("/ by zero");
            }
        } 
    
    #第二种
    /**
         * * A:案例演示
         * try...catch的方式处理多个异常
         * JDK7以后处理多个异常的方式及注意事项
         * 
         * 安卓,客户端开发,如何处理异常?try{}catch(Exception e){}
         * ee,服务端开发,一般都是底层开发,从底层向上抛
         * 
         * try后面如果跟多个catch,那么小的异常放前面,大的异常放后面,根据多态的原理,如果大的放前面,就会将所有的子类对象接收
         * 后面的catch就没有意义了
         */
        public static void main(String[] args) {
            //demo1();
            int a = 10;
            int b = 0;
            int[] arr = {11,22,33,44,55};
            
            //JDK7如何处理多个异常
            try {
                System.out.println(a / b);
                System.out.println(arr[10]);
            } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
                System.out.println("出错了");
            } 
        }
    
        public static void demo1() {
            int a = 10;
            int b = 0;
            int[] arr = {11,22,33,44,55};
            
            try {
                System.out.println(a / b);
                System.out.println(arr[10]);
                arr = null;
                System.out.println(arr[0]);
            } catch (ArithmeticException e) {
                System.out.println("除数不能为零");
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("索引越界了");
            } catch (Exception e) {             //Exception e = new NullPointerException();
                System.out.println("出错了");
            }
            
            System.out.println("over");
        }
    }
    
    
    NO.3 编译时异常和运行时异常的区别
    //Java中的异常分为编译期和运行期异常
            //写个编译期异常--编译时异常可以理解为未雨绸缪异常
            //编译时异常就是必须对其进行处理,不然编译是不通过的
            //这个FileInputStream就是读取文件的,现在在自动编译的时候就报错了。
            //因为我们这个文件路径可能是错误的,就读取不到,所以我们做下处理
    
            //运行时异常:就是程序员的代码错误,需要程序员回来修改代码
    
            try {
                FileInputStream stre = new FileInputStream("tmac.xxx");
            }catch (Exception e){
    
            }
    
    
    NO.4 Throwable的几个常见方法
    /**
         * * A:Throwable的几个常见方法
                * a:getMessage()
                    * 获取异常信息,返回字符串。
                * b:toString()
                    * 获取异常类名和异常信息,返回字符串。
                * c:printStackTrace()
                    * 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
            * B:案例演示
                * Throwable的几个常见方法的基本使用
         */
        public static void main(String[] args) {
            try {
                System.out.println(1/0);
            } catch (Exception e) {         //Exception e = new ArithmeticException("/ by zero");
                //System.out.println(e.getMessage());       //获取异常信息
                //System.out.println(e);        //调用toString方法,打印异常类名和异常信息
                e.printStackTrace();        //jvm默认就用这种方式处理异常
            }
        }
    }
    
    
    NO.5 throws抛出异常的处理方式
    /**
         * * A:throws的方式处理异常
                * 定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
                * 那么就通过throws在方法上标识。
            * B:案例演示
                * 举例分别演示编译时异常和运行时异常的抛出
                * 编译时异常的抛出必须对其进行处理
                * 运行时异常的抛出可以处理也可以不处理
         * @throws Exception 
         */
        public static void main(String[] args) throws Exception {
            Person p = new Person();
            p.setAge(-17);
            System.out.println(p.getAge());
        }
    
    }
    
    class Person {
        private String name;
        private int age;
        public Person() {
            super();
            
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) throws AgeOutOfBoundsException {
            if(age >0 && age <= 150) {
                this.age = age;
            }else {
                //Exception e = new Exception("年龄非法");
                //throw e;
                throw new AgeOutOfBoundsException("年龄非法");
            }
          }
        }
    
    
    NO.6 finaly关键字的作用和特点
    /**
         * * A:finally的特点
                * 被finally控制的语句体一定会执行
                * 特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
            * B:finally的作用
                * 用于释放资源,在IO流操作和数据库操作中会见到
            * C:案例演示
                * finally关键字的特点及作用
            *return语句相当于是方法的最后一口气,那么在他将死之前会看一看有没有finally帮其完成遗愿,如果有就将finally执行
            *后在彻底返回
         */
        public static void main(String[] args) {
            try {
                System.out.println(10/0);
            } catch (Exception e) {
                System.out.println("除数为零了");
                System.exit(0);                             //退出jvm虚拟机
                return;
            } finally {
                System.out.println("看看我执行了吗");
            }
        }
    
    
    NO.7 简单面试题
    //面试题
          //final,finally和finalize的区别
            //final:可以修饰类,不能被继承,修饰方法,不能被重写,修饰变量,只能赋值一次
            //finally:是try语句中的一个语句体,不能被单独使用,用来释放资源
            //finalize:是一个方法,当垃圾回收器确定存在对该对象的过多引用时,由该对象的垃圾回收器调用此方法
    
            //第二题:
            //问:如果catch里面有return语句,finally的代码还会执行吗?如果会,请问是在return前还是return后
            //答:是在return先建立返回路径,然后执行finally语句,最后返回
            //看这个例子
            Test test = new Test();
           int num =  test.method();
            System.out.println(num);
        }
    }
    
    class Test {
      public  int method(){
            int x = 10;
            try{
                x = 20;
                System.out.println(1/0);
                return x;
            }catch (Exception e){
                x = 30;
                return x;
            }finally {
                x = 40;
                System.out.println("finally执行了嘛");
        //千万不要在finally里面写返回语句,因为finally的作用是释放资源,是肯定执行的。如果在这里面写了返回语句,那么try和catch的结果都会被改变          
          }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Java异常学习

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