Logo

郎哥编程

使用try和catch捕获异常

2019-04-19 599

前面了解了Java异常和异常处理类,本节讲述如何使用try和catch语句捕获异常。

Java程序在执行过程中如果出现异常,会自动生成一个异常对象,该异常对象将被自动提交给JVM,当JVM接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。如果JVM找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。

在java中添加捕获异常代码时,需要把认为可能会出现异常的代码包括在try语句块内,处理异常的代码包括在catch语句块内。在程序执行时,如果try语句内的代码出现错误,try会创建异常对象并抛出,catch捕获异常对象,catch语句块内的代码将会执行,这样就可以处理异常错误了。

使用try和catch的语法规则如下:

try {
   可能发生异常的代码
}
catch(异常类型  ex) {
   对异常进行处理的代码
}
下面通过示例演示try和catch的用法,代码如下:
package com.milihu.trydemo;
 
public class TryTest {
 
public static void main(String[] args) {
    // TODO Auto-generated method stub
 
    try {
        number = Integer.parseInt(args[0]);
        //如果存在异常,下面这行代码是不会输出的
        System.out.println("程序没有发生异常");
    } catch(Exception e) {
        System.out.println("非法的数字");
    }
    System.out.println("您输入的数字为:" + number);
}
 
}

上面的代码描述了从控制台获取用户输入的参数,如果将该参数转换为数值成功,输出转换后的数;如果转换有异常,就说明用户输入的是非法的数字。代码非常简单,主要是通过这段代码说明两个问题:一是程序没有异常时,catch的语句是否会被执行;二是程序有异常时,最后的语句还会被执行吗?

(1)输入一个未能转化为数值的参数

新建一个Java项目,输入上面的代码。在菜单栏中选择Run as → Configurations命令,在弹出的Run对话框中选择Arguments标签,在Program  arguments文本框中输入“hello”,然后单击Run按钮,如下图所示:

image.png      

图 1 设置程序运行参数

程序运行后,控制台输出结果如下图所示:

image.png

图 2参数不为数字时的输出结果

(2)输入一个能转化为数值的参数

重复上面的操作,在Program  arguments文本框中输入“2”,然后单击Run按钮,控制台输出的结果如下图:

image.png

图 3 当参数为数值2时的输出结果

通过上述两种方式的比较可以看出,当有异常发生时,异常被捕获,执行catch括号中的语句。并且catch之后的语句也会执行;没有异常发生时,不会执行catch括号中的语句。

前面介绍的是处理单个异常,有时代码可能会引发多个异常,在这种情况下,可以定义两个或更多的catch子句,每个子句捕获一种类型的异常。

多重catch语句的语法规则如下:

try {
   ……….  //代码段
   ……….  //产生异常
}
catch(异常类型1  ex) {
   ………. //对异常1进行处理代码段
} catch(异常类型2  ex) {
   ………. //对异常2进行处理代码段
}
} catch(异常类型n  ex) {
   ………. //对异常n进行处理代码段
}

下面通过示例演示多重catch的用法,代码如下:

class MultiCatch {
 public static void main(String args[]) {
     try {
         int a = args.length;
         System.out.println("a = " + a);
         int b = 42 / a;
         int c[] = { 1 };
         c[10] = 99;
     } catch(ArithmeticException e) {
         System.out.println("Divide by 0: " + e);
     } catch(ArrayIndexOutOfBoundsException e) {
         System.out.println("Array index oob: " + e);
     }
     System.out.println("After try/catch blocks.");
 }
}

代码在没有命令行输入参数条件下运行导致被零除异常,因为a为0。如果输入一个命令行参数,把a设成大于零的数值,就不会出现被零除的异常。但是它将导致ArrayIndexOutOf BoundsException异常,因为整型数组c的长度为1,而程序试图给c[10]赋值。

从上面的例子可以看出,一段代码中可能会产生多种不同的异常,可以设置多个异常抛出点来解决这个问题。

文章小结

异常对象从被抛出到捕捉,实际上是一个执行控制权转移的过程,所以可以根据程序需要合理地控制检测到异常的粒度。如果并不需要知道具体产生的是什么异常,那么可以使用异常的公共父类Exception来处理异常对象,即catch(Exception e){….} 。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论