zoukankan      html  css  js  c++  java
  • 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即可。

     

  • 相关阅读:
    机器学习之大数据集
    机器学习之协同过滤算法(推荐系统)
    机器学习之异常检测
    机器学习之PCA主成分分析
    机器学习之K-means算法
    机器学习之SVM支持向量机
    机器学习之模型选择与改进
    springmvc spring mybatis插入mysql中文乱码
    springmvc和http404错误
    oracle删除users表空间
  • 原文地址:https://www.cnblogs.com/coderising/p/5705273.html
Copyright © 2011-2022 走看看