• 【java】异常和处理


    (根据http://www.imooc.com/learn/110 陈码农老师教学视频总结)

     

    一.异常体系结构

    所有不正常类都继承于Throwable类

    1.异常两个子类 error & Exception

    (1)Error类:

    表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

    (2)Exception类

    (参考 http://bbs.itheima.com/thread-117155-1-1.html wanghe826的回答)

     

    分为:runtime exceptionchecked exception

    面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常

    try{

    //会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里

    }catch(Exception e){

    //处理该异常的代码块,发出警告、记录错误日志

    }

     

    【1】RuntimeException(非检查异常,运行时异常)

    eg. 引用了空对象的属性或方法(空指针),数组访问越界、错误类型转换、除数0算数异常

    运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一.

     

    如果不对RuntimeException处理,出现运行时异常之后,要么是线程中止,要么主程序终止

     

    如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。

     

    如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。

     

    【2】检查(checked)异常 要手动捕获处理

    检查异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。

    二.异常处理

    抛出多个异常(多重catch)

    多个catch

    try{

    //会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里

    }catch(AritheticException e){

    //处理算数为0的情况

    }catch(Exception e){

    // 处理该异常的代码块,发出警告、记录错误日志

    //算数异常使Exception 的子类,按照父亲谦让儿子的顺序

    }

     

    注意:

    顺序问题:先小后大,先子类、后父类,因为会自动找就近匹配的异常处理。上述Exception是上面异常的父类,所以放到最后,不然编译会报错。

    finally善后工作

    具体案例参考 http://www.cnblogs.com/haitao-fan/archive/2012/05/31/2528389.html

     

    finally 结构使代码总会执行,而不管有无异常发生。使用 finally 可以维护对象的内部状态,并可以清理非内存资源

     

    Try{

    //会抛出异常的方法,若抛出异常,该方法终止执行,控制权交给catch里

    }catch(AritheticException e){

    //处理算数为0的情况

    }catch(Exception e){

    // 处理该异常的代码块,发出警告、记录错误日志

    e.printStackTrace();

    }finally{

    //善后工作,最后要处理的代码

    }

     

    三.异常抛出throw

    throws——声明将要抛出何种类型的异常

     

    public void methodName(args1,args2)

    throws 异常列表{

    //调用会抛出的异常的方法或者throw new Exception()

    }

     

    例子

    public void divide(int one, int two) throws Exception{

        if (two==0)

            throw new Exception(""two" can't be zero ");

        else

            System.out.println("the result is :"+one/two);

    }

     

    四.自定义异常

    必须继承java标准类中意思相近的异常类型,或者Exception

    class yourName extends ExceptionType{ }

     

     

    五.异常链

    把捕获的异常包装成新的异常,从新的异常添加对原始异常的引用

    package com.imooc;

     

    public class ChainTest {

     

        /**

         * test1() 抛出drunk异常,

         * test2() 调用test1(),捕获drunk异常,并包装成运行时异常,继续抛出

         * main()调用test2(),尝试捕获test2抛出的异常

         */

        public static void main(String[] args) {

            ChainTest ct=new ChainTest();

            try {

                ct.test2();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

     

        public void test1() throws DrunkException{

            throw new DrunkException("喝酒别开车");    

        }

        

        public void test2() {

            try {

                test1();

            } catch (DrunkException e) {

        RuntimeException newException = new RuntimeException("司机一滴酒,亲人两行泪");

                //调用含参构造器

                newException.initCause(e);//下面有解释

                throw newException;

            }

        }

    }

     

    解释newException.initCause(e)

    出处 http://zy19982004.iteye.com/blog/1975986

    1. 现在所有Throwable的子类子构造器中都可以接受一个cause对象作为参数,这个cause就异常原由,代表着原始异常,即使在当前位置创建并抛出行的异常,也可以通过这个cause追踪到异常最初发生的位置。
    2. 只有Error,Exception,RunimeException提供了带cause参数的构造器,其他的所以异常就只有通过initCause()来设置cause了。

    六.经验总结

    1. 多重catch后面加个catch(Exception),处理可能遗漏的异常
    2. 不确定的代码surrounded with try-catch,处理潜在异常
    3. 尽量处理异常,不要只用简单的调用printStackTrace()
    4. 尽量添加finally去释放占用资源

     

  • 相关阅读:
    通过指定的“虚拟路径”返回路径下“文件名列表”
    ASP.NET Session丢失问题原因及解决方案
    纯CSS打造Bubble气泡提示框
    分享几个超级震憾的图片特效
    有了jQuery.Jcrop,选取美女的哪个部位你说了算
    jQueryTranslator调用Google翻译实例及源码【译】
    轻松学习正则表达式【译】
    Android系统源代码情景分析:基础知识
    HTML5斯诺克桌球俱乐部【译】
    ASP.NET中使用V3版本的Google Maps API【译】
  • 原文地址:https://www.cnblogs.com/xy123001/p/5245337.html
Copyright © 2020-2023  润新知