`
L.G.Alexander
  • 浏览: 155882 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(十一):Java中异常的捕获顺序(多个catch)

阅读更多
import java.io.IOException;
public class ExceptionTryCatchTest {
	public void doSomething() throws IOException{
		System.out.println("do somthing");
	}
	public static void main(String[] args){
		ExceptionTryCatchTest etct = new ExceptionTryCatchTest();
		try {
			etct.doSomething();
		} catch (Exception e) {
			
		} catch (IOException e) {
			
		}
	}

}

问题:上述程序能否编译通过?为什么?
解答:不能编译通过。因为编译的时候会报错:已捕捉到异常 java.io.IOException。  catch(IOException e)这句有错误。
分析:对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。对我们这个方法来说,抛出的是IOException,当执行etct.doSomething();时,可能会抛出IOException,一但抛出IOException,它首先进入到catch (Exception e) {}里面,先和Exception匹配,由于OExceptionextends Exception,根据多态的原则,IOException是匹配Exception的,所以程序就会进入到catch (Exception e) {}里面,进入到第一个catch后,后面的catch都不会执行了,所以catch (IOException e) {}永远都执行不到,就给我们报出了前面的错误:已捕捉到异常 java.io.IOException。

总结:在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要刚在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到...异常的错误。

分享到:
评论
1 楼 tmpttt 2009-10-20  
受教了。

相关推荐

    Java异常发生时程序的执行顺序

    一些基础知识:  1.try代码段包含可能产生例外的代码;...在一个try语句块中,基类异常的捕获语句不可以写在子类异常捕获语句的上面。  看一个例子:   /** * @author Lansine *

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    java面试800题

    Q0045 Java中是怎样捕获异常的? "try { //statement01 } catch(Exception e) { //statement02 } finally { //statement03 }" Q0046 一个文件中是否可以有多个public类? 不可以 Q0047 子类是否可以访问父类的...

    java范例开发大全源代码

     实例48 try…catch嵌套捕获异常的实例 68  4.4 throws声明异常 69  实例49 throws声明异常实例一 69  实例50 throws声明异常实例二 70  4.5 throw抛出异常 72  实例51 throw抛出异常实例一 72  ...

    java范例开发大全

    实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw抛出异常实例一 72 实例52 throw抛出异常实例二...

    Java范例开发大全 (源程序)

     实例48 try…catch嵌套捕获异常的实例 68  4.4 throws声明异常 69  实例49 throws声明异常实例一 69  实例50 throws声明异常实例二 70  4.5 throw抛出异常 72  实例51 throw抛出异常实例一 72  实例52...

    JAVA基础课程讲义

    JAVA中如何实现多线程(重点!!) 168 通过继承Thread类实现多线程 168 通过Runnable接口实现多线程 169 线程状态和sleep/yield/join/stop/destroy方法 170 新生状态 170 就绪状态 170 运行状态 170 死亡状态 170 ...

    jdk-7-window-64

    捕获多个异常,之前捕获的每个异常都需要写一次catch,现在只需要一次catch 例子:catch(IllegalArgumentException | IllegalAccessException e){} 泛型实例化类型自动推断,例子看看就明白,在之前后面的泛型必须写...

    疯狂JAVA讲义

    10.2.1 使用try...catch捕获异常 359 10.2.2 异常类的继承体系 360 10.2.3 访问异常信息 363 10.2.4 使用finally回收资源 364 10.2.5 异常处理的嵌套 367 10.3 Checked异常和Runtime异常体系 367 10.3.1 使用...

    Java范例开发大全(全书源程序)

    实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw抛出异常实例一 72 实例52 throw抛出...

    AIC的Java课程1-6章

     学习使用throw,throws检测抛出异常,使用try,catch捕获处理异常,使用finally子句释放资源。  掌握Java的异常层次结构,辨别checked exception和unchecked exception。  能够分别创建新的异常类,...

    java范例开发大全(pdf&源码)

    实例48 try…catch嵌套捕获异常的实例 68 4.4 throws声明异常 69 实例49 throws声明异常实例一 69 实例50 throws声明异常实例二 70 4.5 throw抛出异常 72 实例51 throw抛出异常实例一 72 实例52 throw抛出异常实例二...

    超级有影响力霸气的Java面试题大全文档

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法...

    java基础案例与开发详解案例源码全

    10.2 使用try和catch捕获异常..2 50 10.3 使用throw和throws引发异常252 10.4 finally关键字255 10.5 getMessage和printStackTrace方法258 10.6 多重catch259 10.7 自定义异常类260 10.8 本章习题261 第11章 11.1 ...

    超爽的自学课件(java)

    这一章将解释try、catch、throw、throws以及finally等关键字在Java中的工作原理。并讲述什么时候应当“掷”出违例,以及在捕获到违例后该采取什么操作。此外,大家还会学习Java的一些标准违例,如何构建自己的违例,...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...

    Java开发技术大全 电子版

    14.4.9处理多个事件的例子463 14.5Swing组件的特性467 14.5.1Swing组件的优势467 14.5.2Swing组件的体系结构468 14.5.3使用Swing组件编写GUI的层次结构468 14.6顶层容器469 14.6.1框架类(JFrame)使用示例469...

    C++大学教程,一本适合初学者的入门教材(part1)

    18.5 对编译多个源文件程序的说明 18. 6 用edt和atexit终止程序的执行 18.7 volatile类型限定符 18.8 整数和浮点数常量的后缀 18.9 信号处理 18.10 动态内存分配:函数calloc和realloc 18.11 无条件转移:goto...

    C++大学教程,一本适合初学者的入门教材(part2)

    18.5 对编译多个源文件程序的说明 18. 6 用edt和atexit终止程序的执行 18.7 volatile类型限定符 18.8 整数和浮点数常量的后缀 18.9 信号处理 18.10 动态内存分配:函数calloc和realloc 18.11 无条件转移:goto...

    java核心知识点整理.pdf

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

Global site tag (gtag.js) - Google Analytics