异常的捕获和处理

认识异常

    异常是指在程序的运行过程中所发生的不正常事件,如所需文件找不到、网络连接不通或者连接中断、算术运算出错(如被零除)、数组下标越界、装载 不存在的类、对null对象操作、类型转换异常等。异常会中断正在运行的程序。

    2.Java异常体系结构

    Java中的异常有很多类型,异常在Java中封装成各种异常类,Java的异常体结构。

所有异常类型都是Throwable类的子类,它派生了两个子类:Error类和Exception类

    (1)Error类:表示仅靠程序本身无法恢复的严重错误,如内存溢出、动态链接失败、虚拟机错误。应用程序不应该抛出这种类型的错误(一般由虚拟机抛出)。假如出现这种错误,应尽力使程序安全退出。

    (2)Exception类:由Java应用程序抛出和处理的非严重错误,如所需文件找不到、网络连接不通过或连接中断、算术运算出错(如被零除)、数组下标越界、装载一个不存在的类、对null对象操作、类型转换异常等。它的各种不同的子类分别对应不同类型的异常。Exception又可分为两大类异常。

    运行时异常:包括RuntimeException及其所有子类。不要求程序必须对它们进行处理

    Checked异常(非运行时异常):除了运行时异常外的其他从Exception类继承来的异常类。

    异常处理机制就像人们对平时可能会遇到的意外情况,预先想好了一些处理的办法。在程序执行代码时,若发生了异常,程序会按照预定的处理办法对异常进行处理,异常吃力完毕之后,程序继续运行。

    Java的异常处理是通过5个关键字来实现的,即tey,finally,catch,throw和throws。

    Java中提供了tey—catch结构进行异常捕获和处理,把可能出现异常的代码放入try语句中,并使用catch语句块捕获异常。

    1)如果try语句块中所有语句正常执行完毕,没有发生异常,那么catch语句块中的所有语句都将会被忽略。
(2)如果try语句块在执行过程中发生异常,并且这个异常与catch语句块种声明的异常类型匹配,那么try语句块种剩下的代码都将被忽略,而相应的catch语句块将会被执行,匹配是指catch所处理的异常类型与所生成的异常类型完全一致或是它的父类。
(3)如果try语句块在执行过程中发生异常,而抛出的异常在catch语句块中没有被声明,那么方法立刻退出。

    try-catch-finally语句块的执行流程大致分为如下两种情况。
 (1)如果try语句块中所有语句正常执行完毕,finally语句块也会被执行。
 (2)如果try语句块在执行过程中发生异常,无论这种异常能否被catch语句块捕获到,都将执行finally语句块中的代码。
    try-catch-finally结构中try语句块是必须存在的,catch finally语句块为可选,但两者至少出现其中之一。
    需要注意的是,即使在catch语句块中存在的return语句,finally语句块中的语句也会执行。发生异常时的执行顺序是,先执行catch语句块中return之前的语句,再执行 finally语句块中的语句,最后执行catch语句块中的return语句退出。
    finally语句块中语句不执行的唯一情况是在异常处理代码中执行了System.exit(1)退出java虚拟机。
    4.使用多重catch处理异常

    在计算并输出商的示例中,至少存在两种异常情况,输入非整数内容和出书为0。
    一段代码可能会引发多种类型 的异常,这是,可以在一个try语句块后面跟多个catch语句块分别处理不同的异常。但排雷顺序必须是从子类到父类,最后一个一般都是Exception类。因为按照匹配原则,如果把父类异常放到前面,后面的catch语句块将不会获得执行机会。
    运行时系统从上到下分别对每个catch语句块处理的异常类型进行检测,并执行第一个与异常类型匹配的catch语句。执行其中一条catch语句之后,其后的catch语句将被忽略。

    如果在一个方法体中抛出了异常,并希望调用者能够及时的捕获异常,java语言中通过关键字throws声明某个方法可能抛出的各种异常以通知调用者。throws可以同时声明多个异常,之间用逗号隔开。

    通过try—catch捕获并处理异常。
    通过 throws继续声明异常。如果调用者不知道如何处理该异常,可以继续通过throws声明异常,让上一级调用者处理异常。main()方法声明的异常将由java虚拟机来处理。

    除了系统自动抛出异常外,在编程过程中,有些问题是系统无法自动发现并解决的,
如年龄不在正常范围内,性别输入不是“男”或“女”等,此时需要程序员而不是系统来自行抛出异常,把问题提交给调用者去解决。
    在java语言中,可以使用throws关键字来自行抛出异常。

使用多个catch的情况:

public class TestException {
    public static void main(String[] args) {
      int[] arr={1,2,4};
      try{
          System.out.println(arr[100]);
      }catch ( NullPointerException e){
          e.printStackTrace();    //打印调用栈的异常信息!
          System.out.println("空指针异常!");
      }catch (ArrayIndexOutOfBoundsException e){
          e.printStackTrace();
          System.out.println("下标越界异常!");
      }
        System.out.println(arr[1]);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值