java异常机制

概述:异常是java程序运行时出现的一些意外情况。

异常的分类:所有的异常都继承自java.lang.Trowable类,Trowable类有两个直接子类,Exception和error。

异常的层次结构图:

             

error是java程序本身无法恢复的严重错误,一般不进行捕获,处理,一般是通知用户并终止程序执行。

检查时异常一般是由通过throws抛出的,该方法的调用者必须在调用该方法时进行捕获、处理,否则将不能进行编译。

异常的处理:使用try{

                    }catch(Exception e){

       }finally{

       }

示例:

public class Test {
    public static void main(String[] args) {
        try{
            String [] s={"l","u","n"};
            for(int i=0;i<=s.length;i++){
                System.out.println(s[i]);
            }
            System.out.println("gg");
        }catch(ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }catch(Exception e){
            System.out.println("程序出错!");
            System.out.println(e.getMessage());
            e.printStackTrace();
        }finally{
            System.out.println("very good");
        }
        
    }
}

try中如果发生异常,那么之后的代码将不会执行,将跳转到catch中。

在catch中 把ArrayIndexOutOfBoundsException封装到对象e中,可以用对象e来输出栈中的错误信息。

finally带码块一定会被执行(除了一种情况外,在catch中出现 System.exit(1)会结束JVM,不执行finally中的代码),即使在catch中写有return 语句finally中的代码依然执行。执行的过程先执行catch中return之前的代码,然后执行finally中的代码,接着回到return 返回结果。(如果最后面也有return 则该return 并不会执行)

示例:

public class Test_Runtime {
    public static int Conver(){
        int a=10;
        try {
            //System.out.println(a);
            int b=5/0;
            //System.out.println(a);
        } catch (Exception e) {
            a=20;
            return a;//执行到这将跳到finally中执行,执行完finally中的代码,然后回到这
        }finally{
            a=30;
            System.out.println(a);
        }
        return a;//该句不会被执行
    }
    public static void main(String[] args) {
        int a=Conver();
        System.out.println(a);
    }
}

输出的结果为:20    执行完finally后回到return 返回结果, 但是如果finally中也有返回语句则会直接返回,不会在回到catch中。

示例:

public class Test_Runtime {
    public static int Conver(){
        int a=10;
        try {
            //System.out.println(a);
            int b=5/0;
            //System.out.println(a);
        } catch (Exception e) {
            a=20;
            return a;
        }finally{
            a=30;
            return a;//在该处返回,不会在回到catch
        }
    }
    public static void main(String[] args) {
        int a=Conver();
        System.out.println(a);
    }
}

输出结果:30

如果返回的是引用(可以证明finally里面的代码确实执行了)

public class TestException {
        public static int[] Conver(){
            int []a=new int[10];
            try {
                int b=5/0;
                //System.out.println(a);
            } catch (Exception e) {
                a[0]=10;
                System.out.println(a[0]);
                return a;//执行到这将跳到finally中执行,执行完finally中的代码,然后回到这
            }finally{
                a[0]=30;
                System.out.println(a[0]);
            }
            return a;//该句不会被执行
        }
        public static void main(String[] args) {
            int[] a=Conver();
            System.out.println(a[0]);
        }
}

输出结果 10  30   30 

throw 和throws关键字的区别:throw在方法体内,只能抛出一个异常,在方法体内进行处理,也可以不处理,但必须用throws向外抛出,由方法的调用者去处理。

                                         throws在方法体外,紧跟方法名后,一般为检查时异常,方法的调用则一般要进行处理(也可以继续向外抛)。

                                         throws表示异常可能发生,但不一定会发生,throw表示抛出异常的这种动作,异常一定发生。

自定义异常时一般继承Exception或者RuntimeException即可。

 

原文地址:https://www.cnblogs.com/coderising/p/5705273.html