问:等一会。这么说每次我的程序遇到异常,除非我写了代码去捕获异常,它都会停止正在做的事情?这怎么会是好事儿呢?
答:异常最好的一方面就是可以引起你的注意,帮你找到出错的地方和原因。任何时候你的出现出现了异常,那就是你未预期的事情发生了。如果出了一些问题,而你对此一无所知,程序的结果就有可能是错的,而从那一刻起程序的行为就和你写代码时预期的大不一样了。想像一下你的出现出错了,而你并不知晓,你的用户开始给你打电话告诉你数据错误了,你的程序不稳定。所以异常打断程序正在做的事儿是件好事儿。这强迫你在问题还好找并容易修改的时候去处理问题。
问:好吧,那什么是已处理的异常?什么是未处理的异常呢?
答:程序抛出异常的时候,运行时会去你的代码中去寻找匹配的catch 块。如果你写了匹配的 catch 块,这个异常就是已处理的,否则就是未处理的。
问:指明要捕获的某种异常那一块是怎么回事?为什么我要那么做呢?
答:你应该捕获某种特定的异常而不是去捕获Exception 。比如,假如你的 Excuse 类想要防止一个 FileNotFoundException ,你就可以写 catch ( FileNotFoundException )。这时如果出现了文件未找到的问题,程序可以处理 -- 但是如果出现了 IO 异常或者序列化异常,你写的异常处理就无法捕获这些异常。
问:如果写了一个没有指明特定异常的catch 块的话会怎么样?
答:这样的catch 块可以捕获 try 块会抛出的任何异常。
问:如果没指定特定异常的catch 块可以捕获所有异常,那我为什么要指定某种特定异常呢?
答:问得好,这是因为某种特定的异常会要求某种特定的响应。
问:所有的异常处理的顺序都是try/catch/finally ?
答:不是的,你可以把它们混合起来用。可以写很多个catch 块,也可以不写 catch 块。只有 try/finally 块是合法的。我们稍后会讨论这些的。
未处理的异常意味着你的程序将以不可预知的方式
运行。所以程序遇到一个未处理的异常的时候就会
停止下来。