Java异常处理是通过5个关键字来管理的,他们是try,catch,throw,throws和finally.他们形成了相互关联的子系统,使用其中一个就意味着要使用另一个.然而,首先理解每一个关键字在异常处理中多扮演的角色是很有用处的.这里简单说明他们的工作原理.
进行异常监测的程序语句包含在try代码块中,如果try代码块中有异常发生,那就要抛出(throw)该异常.代码可以使用catch捕获这个异常,并以某种合理的方式对其进行处理.系统产生的异常由Java运行时系统自动抛出.如果要手动抛出异常,则要使用关键字throw.在某些情况下,从一个方法抛出的异常必须用throws语句指定为异常.任何从try代码块退出时必须被执行的代码,都要放在finally代码块中.
问:能解释一下产生异常的条件吗?
答:异常产生的方式有三种.第一种是当某些内部错误发生时,Java虚拟机可以产生异常,该异常不在你的控制范围内.通常你的程序不会处理这种类型的异常.第二种是由程序代码中的错误导致的标准异常.这种异常需要你来处理.第三种是通过使用throw语句手动生成的异常.无论异常是如何产生的,处理异常的方式都是一样的.
1.使用关键字try和catch
异常处理的核心是try和catch.这两个关键字要一起使用,只有try而没有catch,或者只有catch而没有try都不对.下面是try/catch异常处理代码块的基本形式:
try { } catch (ExceptionType1 exOb) { } catch (ExceptionType2 exOb) { }
此处,ExceptionType1和ExceptionType2是指发生异常的类型.当抛出一个异常时,异常会由相应的catch语句捕获并处理.如基本形式中所示,与一个try相关的catch语句可以有多个.异常的类型决定了要执行哪个catch语句.即,如果由一个catch语句执行的异常类型与发生的异常类型相符,那么就会执行这个catch语句(其他catch语句则被跳过).当一个异常被捕获后,exOb会接收他的值.
有一点很重要:如果没有抛出异常,那么try代码块就会正常结束,并且会跳过他们他的所有catch语句,从最后一个catch后面的第一个语句继续执行.因此,只有在有异常被抛出时,才会执行catch语句.
注意:JDK7为try语句增加了一种新的形式,支持自动资源管理.这种新的形式叫做try-with-resources.
2,一个简单的异常示例
下面是一个简单的示例,用以说明如何监视和捕获异常.如你所知,试图超出数组边界来索引数组会出错.当此错误发生时,JVM会抛出ArrayIndexOutOfBounds Exception异常.如下所示:
public static void main(String args[]) { int nums[] = new int[10]; try { nums[11] = 9; } catch(ArrayIndexOutOfBoundsException exc) { System.out.println("Index out of bounds!"); } }
尽管很短,但是前面的程序还是说明了关于异常处理的几个关键点.第一点,要监视的代码包含在try代码块中.第二点,当发生异常时,从try代码块抛出异常,并被catch语句捕获.此时,控制传递给了catch,try代码块被终止.即,不是调用catch,而是程序执行转移到了他那里.因此不会执行越界索引后的代码.因此异常处理程序工作就是消除由异常引起的问题,以使程序可以继续正常执行.
切记,如果try代码块没有抛出异常,那么不执行任何catch语句,并且程序控制转移到catch语句的后面.