异常

Java中有三种异常:

  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
  • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。        检查性异常就是我们的工具会指出这个地方可能有错误。
  • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
package com.shiro.springbootshiro.exception;

/**
 * 作用:异常的学习
 */
public class Exception1 {
    public static void main(String[] args) {
        //int i=1/0;
        //System.out.println(i);  //抛出ArithmeticException  它的父类是:RuntimeException 是运行时异常
        int[] a = {3,4,2,1};
        try {
            System.out.println(a[4]);
        }catch (ArrayIndexOutOfBoundsException  e){
            //捕获到了下标越界异常。
            System.out.println("捕获到了异常");
            e.printStackTrace();
        }

    }
}

throws:

package com.shiro.springbootshiro.exception;

/**
 * 作用:异常的学习
 */
public class Exception1 {
    public static void main(String[] args) {
        Exception1.exception1();
    }

    public static void exception1() throws ArrayIndexOutOfBoundsException{
        int[] a={1,2,3};
        System.out.println(a[3]);
    }
}

输出:

throws是这个方法有可能会抛出异常。用来提高程序的健壮性。

我们看下这个例子:

package com.shiro.springbootshiro.exception;

/**
 * 作用:异常的学习
 */
public class Exception1 {
    public static void main(String[] args) {

        try{
            int i = 100/ 0;
            System.out.print(i);
        }catch(Exception e){
            System.out.print(1);
            e.printStackTrace();
           // throw new  RuntimeException();
        }finally{
            System.out.print(2);
        }
        System.out.print(3);
    }
    }

输出的结果:

 //e.printStackTrace();
           throw new  RuntimeException();

输出:

首先执行try,遇到算术异常,抛出,执行catch,打印1,然后抛出RuntimeException,缓存异常,执行finally,打印2,然后抛出RuntimeException。

try catch是直接处理,处理完成之后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。

自定义异常:

如果是一个检查性异常,就继承Exception

如果是一个运行时异常,就继承RuntimeException .

为什么要自定义异常呢。假如我们的业务中我们认为的是异常,但是Java中没有,这个时候就要我们自己来编写异常

假如我们认为:中性是异常。

package com.shiro.springbootshiro.exception;

/**
 * 作用:自定义异常
 */
public class MyException extends Exception {

    public MyException(String message) {
                 super(message);
             }

}
package com.shiro.springbootshiro.exception;

/**
 * 作用:异常的学习
 */
public class Exception1 {
    public static void main(String[] args) throws MyException {
        String[] sexs = {"男性","女性","中性"};
                 for(int i = 0; i < sexs.length; i++){
                          if("中性".equals(sexs[i])){
                                  throw new MyException("你全家都是中性!");
                              }else{
                                  System.out.println(sexs[i]);
                              }
                }
    }
    }

输出:

 

什么时候不知晓finally

package com.shiro.springbootshiro.exception;

/**
 * 作用:异常的学习
 */
public class Exception1 {
    public static void main(String[] args) throws MyException {
        try {
            int i = 1 / 0;
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
            //return;
        }finally {
            System.out.println("执行了finally");
        }

    }
    }

如果是return的话,还是会执行finally里的代码,只有当退出JVM的时候,才不会执行。

posted @ 2019-04-18 22:49  陆伟  阅读(129)  评论(0编辑  收藏  举报