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替换所有具体的异常类呢?

1、异常类型繁多,需要根据不同类型进行更细致的处理,如打印message,失败重试,报警邮件等等。

2、增强代码可读性,程序员应该对预期(受检)异常心中有数,而不是直接上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!

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



 

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值