Java异常学习

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的结果都会被改变          
      }
    }
}

    原文作者:浮桥小麦
    原文地址: https://www.jianshu.com/p/c72d00c35a12
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞