java 返回值不同_Java中的异常和返回值有什么区别?

上面的几位同学更多地从语言使用方面来说明返回值与异常的区别,都总结的差不多了,我就不再继续啰嗦了。下面我说说自己的看法,仅供参考:异常与返回值最大的区别是程序执行序的不同。在一个方法执行体内部,返回值是表示一个方法按照既定的逻辑(内部包含顺序、分支、循环和乃至goto的跳转)执行完毕,退出当前层次的调用;而异常更像是一种longjump,使得方法跳出既定的逻辑,返回到上层调用者。这样,在一个包含多层嵌套调用的执行过程中,如果不同层次的调用在某些条件下需要相同的处理逻辑,异常就提供了一个很好的统一处理策略。

异常和返回值的执行开销不同。java是一个基于栈的语言,程序的执行是通过调用栈来完成的。在进入一个方法体的时候,会往当前线程调用栈push一个栈帧,该栈帧相当于构建了该方法执行的一个上下文(包含入参,局部变量等)。多个嵌套调用对应就会有多次push栈操作。返回值表示当前层次调用完毕,调用栈只需简单执行pop操作即可。如果是异常,则需要维持整个线程调用层次的栈信息,并依次上溯,判断调用链上的某个上层调用是否能catch该异常。从这点来说,异常的开销要大于返回值的执行开销,所以在编码的时候,不要随便抛出异常,确实是异常情况才考虑抛出异常。

以上2点是主要差别,从第2点可知异常在抛出时候会记录调用栈的信息,这个在Throwable的源码中可以体现。基于这点,有一个不常见但某些时候比较有用的用法,如下所示,用以跟踪代码执行路径,这个一般在一些测试框架中会出现。

public class Location {

private Throwable t;

...

Location() { t = new Exception(); }

...

// 还可以根据需要过滤t的栈帧

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值