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

  • 相关阅读:
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 26 删除排序数组中的重复项
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 25 K个一组翻转链表
    Java实现 LeetCode 24 两两交换链表中的节点
    Java实现 LeetCode 24 两两交换链表中的节点
    Java实现 LeetCode 24 两两交换链表中的节点
  • 原文地址:https://www.cnblogs.com/pengguozhen/p/14779556.html
Copyright © 2011-2022 走看看