理论教育 Java面向对象程序设计:捕获处理异常的方法

Java面向对象程序设计:捕获处理异常的方法

时间:2023-11-25 理论教育 版权反馈
【摘要】:异常处理的核心是try 和catch。尽管语法允许有try而没有catch,但不能实现捕获并处理异常,而只要有catch 就必须有try。当try描述的代码段遇到异常发生时,计算机控制权由try 转移到catch 异常处理代码块。下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try 块和一个catch 子句。使用try/catch 进行异常处理的情况上面的程序执行结果如下:一旦异常被引发,程序控制由try 块转到catch 块。当一个异常发生时,try/catch 语句会寻找与该异常类相匹配的参数。

Java面向对象程序设计:捕获处理异常的方法

异常处理的核心是try 和catch。这两个关键字通常要一起使用。尽管语法允许有try而没有catch,但不能实现捕获并处理异常,而只要有catch 就必须有try。当try描述的代码段遇到异常发生时,计算机控制权由try 转移到catch 异常处理代码块。也就是说,如果没有异常发生,程序不会执行catch 描述的代码段。下面是try/catch异常处理代码块的基本形式:

当抛出一个异常时,异常会由相应的catch 语句捕获并处理。与一个try 相关的catch语句可以有多个,构成多重catch 语句,异常类型决定了要执行哪个catch 语句。也就是说,如果由一个catch 语句指定的异常类型与发生的异常类型相符,那么就会执行这个catch 语句(其他的catch 语句则被跳过)。捕获一个异常后,catch 括号中的异常对象会接收异常的相关状态,在catch 中可以通过异常对象来访问异常相关信息,从而可以更好地、更有针对性地处理这个异常。

如果没有抛出异常,那么try 代码块就会结束,并且会跳过它的所有catch 语句,从最后一个catch 后面的第一个语句继续执行。因此,只有在有异常抛出时,才会执行catch 语句。

下面通过两个简单的示例,说明出现异常时的情况,以及如何监视并捕获一个异常。

(1)没有使用异常处理的情况

当Java 运行时系统检查到被零除的情况,它构造一个新的异常对象然后引发该异常。这导致ExceptionExam 的执行停止,因为当一个异常被引发时,它必须被一个异常处理程序捕获并且被立即处理。该例中,没有提供任何自己的异常处理程序,所以异常被Java 运行时系统的默认处理程序捕获。任何不是被程序捕获的异常最终都会被该默认处理程序处理。默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。Java JDK 运行时解释器执行该程序所产生的输出信息如下:

上面引发的异常类型是Exception 的一个名为ArithmeticException 的子类,该子类更明确地描述了此异常信息。在前面已经列出Java 提供多个内置的与可能产生的不同种类运行时错误相匹配的异常类型。(www.daowen.com)

尽管由Java 运行时系统提供的默认异常处理程序对于调试是很有用的,但通常用户希望自己处理异常。这样做有两个好处,首先,它允许你修正错误;其次,它防止程序自动终止。下面的程序包含一个处理因为被零除而产生的ArithmeticException 异常的try 块和一个catch 子句。

(2)使用try/catch 进行异常处理的情况

上面的程序执行结果如下:

一旦异常被引发,程序控制由try 块转到catch 块。上面的程序代码“a=42/i;”发生了被零除异常,在try 块中的“System.out.println("结果为:"+a);”不会执行转而执行catch 中的语句,catch 块执行后,程序控制从整个try/catch 机制的下面一行继续执行,不会从catch 块“返回”到try 块。

一个try 和它的catch 语句形成了一个单元。catch 子句的范围限制于try 语句前面所定义的语句。一个catch 语句不能捕获另一个try 声明所引发的异常(除非是嵌套的try 语句情况)。被try 保护的语句声明必须在一个大括号之内(也就是说,它们必须在一个块中)。

需要说明的是,构造catch 子句的目的是解决异常情况,只要程序处理了异常就像错误没有发生一样继续运行。catch 语句只有一个参数,参数可以是一个类或一个接口。当一个异常发生时,try/catch 语句会寻找与该异常类相匹配的参数。一个参数与指定异常相匹配,有三种情况:一是该参数和指定的异常是同一个类;二是该参数是指定异常的子类;三是如果参数是一个接口,指定异常类实现了这个接口。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈