以下所列举的异常类如:Exception1,Exception2都是Exception的子类,Exception类是所有异常的基类,Exception继承自Throwable
try{}catch(Exception1 ex1){}catch(Exception2 ex2){}......{}finally{}每个try可以跟多个catch(参数必须有,类型可以不同),catch会根据try抛出的异常类型进行选择匹配不同于switch(){case ...break;}Exception 是所有异常类的基类,如果第一个catch的参数就是Exception类型,那么就不会寻找后面的catch匹配,即使有匹配的类型,由此可见每个异常只允许一个catch来抓,
try{}catch(Exception1 ex1){ throws new Exception2;}finally{}以上在catch块里又抛出新异常,那么包含以上代码块的方法也必须抛出相同的异常让上一层方法来处理新异常,例如public type method() throws Exception2{ try{ }catch(Exception1 ex1){ throws new Exception2; }finally{ }}在调用method()方法的方法里必须处理异常Exception2,否则会报错。
另外,即使在方法体内没有抛出异常也可以在声明方法时虚张声势,例如:public type method() throws Exception2{ try{ }catch(Exception1 ex1){ }finally{ }}
不知道大家注意到没有上面的代码有些疑问的地方,例如://代码1try{}catch(Exception1 ex1){ throws new Exception2;}finally{}catch抓的异常(Exception1)和新抛的异常(Exception2)不同,为什么呢?首先需要说明的是catch捕获的Exception异常信息没有子类(Exception1,Exception2)的详细,所以在使用中,为了能更准确地找到错误的根源,我们会采用异常继承类而不是直接使用Exception,更重要的是上述问题下面让我用另一段代码跟上述代码作比较//代码2try{}catch(Exception1 ex1){ throws new Exception1;}finally{}显然,抓住的异常和新抛的异常相同,跟上面相比差别只在于新抛的异常
代码2新抛的异常跟try抛出的异常在堆栈里是在同一个位置,而代码1新抛的异常则是新的位置跟try块不同这就是它们的区别 如果在代码2中添加一句,就可以达到跟代码1同样的效果try{}catch(Exception1 ex1){ ex1.fillInStackTrace(); throws new Exception1;}finally{}
如果只出现如下错误(没有打印堆栈错误),理论上讲错误不在try{}块内,而是程序正常运行产生的异常 ERROR - java.lang.NullPointerException ERROR - java.lang.NullPointerException注:try{}抛出的异常我在catch里都有ex.printStackTrace()输出