• 6-1、异常处理


    1、异常概念

    异常:在Java语言中,将程序执行中发生的不正常情况称为“异常”。
    Java中的异常用于处理非预期的情况,如文件没找到,网络错误,非法的参数

    Java程序运行过程中所发生的异常事件可分为两类:
    Error: JVM系统内部错误、资源耗尽等严重情况
    Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,例如:
    空指针访问
    试图读取不存在的文件
    网络连接中断

    2、异常处理机制

    Java提供的是异常处理的抓抛模型。

    Java程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。

    如果一个方法内抛出异常,该异常会被抛到调用方法中。如果异常没有在调用方法中处理,它继续被抛给这个调用方法的调用者。这个过程将一直继续下去,直到异常被处理。这一过程称为捕获(catch)异常。
    如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。
    程序员通常只能处理Exception,而对Error无能为力
    异常体系

    3、异常的体系结构:

    java.lang.Throwable

    • |-----Error:错误,程序中不进行处理
    • |-----Exception:异常,要求在编写程序时,就要考虑到对这些异常的处理
    • |-----编译时异常:在编译期间会出现的异常(执行javac.exe命令时,出现异常)
    • |-----运行时异常:在运行期间出现的异常(执行java.exe命令时,出现异常)

    运行时异常和编译时异常
    前面但使用的异常都是RuntimeException类或是它的子类,这些类的异常的特点是:即使没有使用try和catch捕获,Java自己也能捕获,并且编译通过 ( 但运行时会发生异常使得程序运行终止 )。
    如果抛出的异常是IOException类的异常,则必须捕获,否则编译错误。

    常见的运行时异常:
    1.数组下标越界的异常:ArrayIndexOutOfBoundsException
    2.算术异常:ArithmeticException
    3.类型转换异常:ClassCastException
    4.空指针异常:NullPointerExcetion
    编译时异常:

    4、异常处理

    第一种:使用 try…catch…finally 处理异常。(捕获异常)

    第二种:声明抛出异常
    如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显式地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。
    在方法声明中用 throws 子句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。

    重写方法不能抛出比被重写方法范围更大的异常类型

    第三种:用户自定义异常类
    第四种:人工抛出异常

    结论:
    1、不管有木有出现异常,finally块中代码都会执行;
    2、当try和catch中有return时,finally仍然会执行;
    3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
    4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
    举例:
    情况1:try{} catch(){}finally{} return;
                显然程序按顺序执行。
    情况2:try{ return; }catch(){} finally{} return;
              程序执行try块中return之前(包括return语句中的表达式运算)代码;
             再执行finally块,最后执行try中return;
             finally块之后的语句return,因为程序在try中已经return所以不再执行。
    情况3:try{ } catch(){return;} finally{} return;
             程序先执行try,如果遇到异常执行catch块,
             有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,
                         最后执行catch块中return. finally之后也就是4处的代码不再执行。
             无异常:执行完try再finally再return.
    情况4:try{ return; }catch(){} finally{return;}
              程序执行try块中return之前(包括return语句中的表达式运算)代码;
              再执行finally块,因为finally块中有return所以提前退出。
    情况5:try{} catch(){return;}finally{return;}
              程序执行catch块中return之前(包括return语句中的表达式运算)代码;
              再执行finally块,因为finally块中有return所以提前退出。
    情况6:try{ return;}catch(){return;} finally{return;}
              程序执行try块中return之前(包括return语句中的表达式运算)代码;
              有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
                           则再执行finally块,因为finally块中有return所以提前退出。
              无异常:则再执行finally块,因为finally块中有return所以提前退出。

    最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
                      如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
                      编译器把finally中的return实现为一个warning。

  • 相关阅读:
    [Javascript] Broadcaster + Operator + Listener pattern -- 10. Define a Function to Set Common Behaviors in Operators
    [Java Spring] Aspect
    [Javascript] Broadcaster + Operator + Listener pattern -- 24. Design choice, ifElse or merge
    [Javascript] Broadcaster + Operator + Listener pattern -- 23. ifElse operator
    [Git] Revert to a old commit
    [Tools] Dendron
    [Java Spring] Spring Expression Language
    [Java Spring] @Profile
    [Java Spring] @Value & override properties by environment variables
    [Java Spring] Implementing Spring Security
  • 原文地址:https://www.cnblogs.com/pengguozhen/p/14779556.html
Copyright © 2020-2023  润新知