无法捕获异常:Java关于在catch中抛出一个异常给外围函数却捕获不到该异常的思考

11 篇文章 0 订阅

先给出一串代码:

public class TestException {
	public TestException(){
	}
	
	boolean testEx()throws Exception{
		boolean ret=true;
		try{
			ret=testEx1();
		}
		catch(Exception e){
			System.out.println("testEx, catch exception");
			ret=false;
			throw e;
		}
		finally{
			System.out.println("testEx, finally:return value:"+ret);
			return ret;
		}
	}
	
	boolean testEx1()throws Exception{
		boolean ret=true;
		try{
			ret=testEx2();
			if(!ret){
				return false;
			}
			System.out.println("testEx1, at the end of try");
			return ret;
		}
		catch(Exception e){
			System.out.println("testEx1, catch exception");
			ret=false;
			throw e;
		}
		finally{
			System.out.println("testEx1, finally:return value:"+ret);
			return ret;
		}
	}
	
	boolean testEx2()throws Exception{
		boolean ret=true;
		try{
			int b=12;
			int c;
			for(int i=2;i>=-2;i--){
				c=b/i;
				System.out.println("i="+i);
			}
			return true;
		}
		catch(Exception e){
			System.out.println("testEx2, catch exception");
			ret=false;
			throw e;
		}
		finally {
			System.out.println("testEx2, finally:return value="+ret);
			return ret;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TestException testException1=new TestException();
		try{
			testException1.testEx();
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}

}

对于函数testEx2()中catch块中抛出的异常,testEx1()函数却捕获不到,这是为什么呢?
我想过一种可能:testEx1()中将testEx2()的返回值赋值给ret,即 ret=testEx2(),而testEx2()中抛出的异常在这个过程中被过滤掉了。因为如果我直接把testEx2()放在testEx1()中,而不是通过ret=testEx2()的方式,那么这个异常是能够被捕获的。

原先,我也在网上向别人求证这个想法,也通过调试想验证这个想法,但显然是无意义的,这个问题已经很明确了,这个想法已无可挑剔。

为什么这么说呢?首先,我们调试发现这个捕获不到的异常其实已经不存在了,因为当我们运行ret=testEx2()这条语句时,我们实际上是将一个值赋给一个变量,而原先testEx2()里的代码已经不存在了,也就是说,在testEx1()函数中,testEx2()本就不存在,可以理解为testEx1()只是将testEx2()当作工具使用,并将用其所获取的值赋给了变量ret,仅此而已。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值