java异常捕获的一点感悟

class Annoyance extends Exception {}
class Sneeze extends Annoyance {}

class Human {

	public static void main(String[] args)
		throws Exception {
		try {
			try {
				throw new Sneeze();
			}
			catch ( Annoyance a ) {
				System.out.println("Caught Annoyance");
				throw a;
			}
		}
		catch ( Sneeze s ) {
			System.out.println("Caught Sneeze");
			return ;
		}
		finally {
			System.out.println("Hello World!");
		}
	}
}

今天看到这么一段代码,请问输出的内容是什么?

先别给出答案,思考一下平时我们写代码的过程中,异常捕获的过程和顺序,比如有这么一段代码:

try {
			throw new FileNotFoundException();
		} catch (IOException e) {

		}

我们经常能看到这样的代码,也就是使用父类能够捕获子类的异常,当然所有的异常都是继承Exception的,那么为什么不用Exception替换所有具体的异常类呢?这个是要考虑到我们对代码中预期异常的掌握,也就是某些代码会产生什么样的异常,程序员应当心中有数,如果全都用Exception的引用来接收,大家都是稀里糊涂的,如何进行处理也会变得难以着手。但如果在Catch代码块中不打算做任何处理,仅捕获而已,那么这时使用Exception也没什么关系,但正是生产环境下,这样的情况应该不允许存在的,这个看JDK的源码就知道了,捕获异常以后一定要给出提示信息的。

以上的代码证明了,我们可以用父类的引用接受子类的异常对象,那么问题来了,最上面的代码执行结果是什么呢?答案是:

Caught Annoyance
Caught Sneeze
Hello World!

相信第一行和第三行大家都没什么疑问了,关键是第二行,应该出来吗?是不是子类捕获了父类的异常呢?

经过断点的加入,我们发现,尽管

catch ( Annoyance a ) 

这一句使用的是父类的引用,但实际上是子类的对象,这是java中多态的经典表现。在

catch ( Sneeze s )

的时候当然可以捕获到自己抛出来的异常了。

为了证明,子类从本质上无法捕获父类的异常,我们继续做个试验:

try {

			throw new Annoyance();
		} catch (Sneeze s) {
			System.out.println("Caught Sneeze");
			return;
		} finally {
			System.out.println("Hello World!");
		}

可以看到,抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?

Hello World!
Exception in thread "main" com.xq.exceptions.Annoyance
	at com.xq.exceptions.Human.main(ExceptionTest.java:14)

可以看到,出了问题了,也就是说,父类throw出来的异常,子类并没有捕获到,继续往下证明:

try {

			throw new Annoyance();
		} catch (Sneeze s) {
			System.out.println("Caught Sneeze");
			return;
		} catch (Exception e) {
			System.out.println("Caught Exception");
			return;
		} finally {
			System.out.println("Hello World!");
		}

既然子类捕获不了,那就使用Exception,可以看到结果如下:

Caught Exception

Hello World!

看到这样,大家肯定都明白了,不用多说了!

时间: 2024-10-24 18:47:28

java异常捕获的一点感悟的相关文章

Java异常捕获

1 public class Main { 2 3 /** 4 * 在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面, 5 * Exception这个异常的根类一定要刚在最后一个catch里面, 6 * 如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到异常的错误. 7 * @param args 8 */ 9 public static void main(String[] args) { 10 int a[] = new int[] {1,2,3,

java 异常捕获小记

java 中异常捕获常用的为: try{ //业务代码 }catch(Exception e){ //异常捕获 }finally{ // 不管有无异常, 最后都会执行到这里 } 在方法体内如果想要把异常抛出到方法外, 在定义方法的时候 需要通过 throws 来声明所要抛出的异常类型, 在调用该方法的方法内,可以捕获该异常 如: public void function(String args) throws Exception{ if(null == args){ throw new Null

java 异常捕获

异常捕获语句: try-catch(多catch块)-finally 代码格式: try-catch以及try-catch-finally try{ //一些会抛出的异常 }catch(Exception e){ //处理该异常的代码块 }finally{ //最终要执行的代码 }  语句示例: 1 try{ 2 double d = 5/0; 3 }catch(Exception e){ 4 System.out.println("算数异常"); 5 }finally{ 6 Syst

Java异常捕获之try-catch-finally-return的执行顺序-转载

情况1:try块中没有抛出异常try和finally块中都有return语句 [java] view plain copy public static int NoException(){ int i=10; try{ System.out.println("i in try block is"+i); return --i; }catch(Exception e){ --i; System.out.println("i in catch - form try block i

java 异常捕获与异常处理

try{会产生异常的代码 }catch(出现异常的类型 e){ 异常出现后处理的方法 } 一旦异常出现又没有异常处理,程序就会中断. public static void main(String[] args) {        try {            int num = 10 / 0;            System.out.println(num);        } catch (ArithmeticException e) {            System.out.p

Java异常捕获之一道try-catch-finally语句题

今天,学习了try-catch-finally语句,本来觉得蛮简单.易懂的.搜了一道相关类型的题.结果信心被泼了盆冷水.先把题Mark一下,出去透透风. 1 public class TestEx { 2 private int c; 3 4 public TestEx() { 5 } 6 7 @SuppressWarnings("finally") 8 boolean testEx() throws Exception { 9 boolean ret = true; 10 try {

黑马程序员-Java异常详解

--Java培训.Android培训.iOS培训..Net培训.期待与您交流! --- 异常的介绍 Java中的异常就是那些会阻碍当前程序运行,使程序执行可能失败的一些可能情况,如程序中出现除零错误,数组下标越界等.异常在Java中被封装成了一个类,继承自Throwable,名为Exception,它有很多子类,分别描述了系统中很多常见的异常情况,这些异常机制的出现使得编写程序时对一些问题的处理变得尤为方便,下面是一些简单的使用情况. 异常捕获的一般格式 /** * javac Exceptio

java异常查看利器之使用 jvmti 的Callback_JVMTI_EVENT_EXCEPTION 事件查看异常

阅读本文前需要了解什么是jvmti,jvmti全称称之为 JVM Tool Interface,有关jvmti更详细的知识,本文不再详细列出.大家可以借助百度来了解有关它更为详尽的内容. 在开源文件大行其道的今天,基于java种种解决方案和框架纷绘踏至而来,浩瀚如海看不完也学不尽.在采用这些解决方案和框架进行项目开发时,往往会出现当程序卡壳时,既无异常提示信息亦没有与之对应的日志输出的局面.每每出现这样的困境时,往往只能通过打断点来一步步调试跟踪来解决.更有甚者,基于某一底层的框架进行相应的开发

java 异常的捕获及处理

在没有异常处理的程序中如果要回避异常,需要使用大量的判断语句,配合所想到的错误状况来捕捉程序中可能发生的错误.但是这样势必会导致程序运行效率降低.java异常处理机制具有易于使用,可自定义异常类,处理抛出的异常的同时,又不会降低程序运行效率等优点.因而在java程序设计时,应充分的利用异常处理机会,以增进程序的稳定性及效率.1.异常处理示例及基本格式: package javaBasics; public class test5 { public static void main(String[