I2.2.2 现在处理:try-catch块
要处理异常,必须先标出可能引起异常的Java语句。还必须决定要寻找哪个异常。方法的文档及throws子句会告诉我们可能发生哪个受检异常。这就是我们要处理的异常。
处理异常的代码含有两段。第一段,try块(try block),含有可能抛出异常的语句。第二段含有一个或多个catch块。每个catch块(catch block)含有处理或捕获(catch)某种类型异常的代码。所以,因为调用方法readString而处理IOException的代码可能有如下的形式:
try块中的语句的运行,与没有这个块时是一样的。如果没发生异常,则try块全部执行,然后执行catch块后的语句。但如果在try块内发生了IOException,则执行立即转到catch块。现在已经捕获了异常。
catch块的语法类似于一个方法定义。标识符e称为catch块参数(catch block parameer),它表示catch块将处理的IOException的对象。虽然catch块不是方法定义,但在try块内抛出一个异常,类似于调用一个catch块,其中参数e表示一个实际的异常。
作为一个对象,每个异常都有存取方法getMessage,它返回抛出异常时创建的描述字符串。通过显示这个字符串,可以告诉程序员所发生异常的性质。
catch块执行完后,执行它后面的语句。但如果问题是严重的,最好的反应是中断程序吗?catch块可以调用exit方法来终止程序,如下所示:
赋给System.exit的参数0,表示程序的正常结束。虽然我们遇到了一个严重问题,但我们有意中断程序,这在操作系统看来是正确的。
注:如果没有处理受检异常,或在throws子句中声明它,编译程序会抱怨。有些异常可以在方法的定义中处理,而有些可以在它的throws子句中声明。一般地,不处理或声明运行时(未检)异常,因为它们表示程序的一个错误。抛出这样的异常时会中断程序的执行。
注:其参数是C类型的catch块,可以捕获类C或C的任何后代类的异常。