当前位置: 首页 > 知识库问答 >
问题:

使用try-finally在返回后执行语句

欧阳高昂
2023-03-14
Foo result = array[index];
index = (index + 1) % array.length;
return result;
try {
    return array[index];
} finally {
    index = (index + 1) % array.length;
}

(在本例中,假设indexarray的有效索引,并且代码不会引发ArrayIndexOutOfBoundsException)

编辑:问题不是关于使用try-finally的必要性,而是关于我选择这样做时在性能上的任何收益或损失。没有它,就会创建一个变量。使用它,返回的值被存储在其他地方,也许是以一种更有效的方式。

共有1个答案

谢修真
2023-03-14

如果没有finally,您实际上声明了一个额外的foo变量。
但是它真的很贵吗?不像这两种情况一样,foo对象存在于内存中。您只是添加了一个访问它的引用。
对方法范围内的对象的引用确实很便宜。
您不必担心这个问题。

此外,您不必使用finally语句作为提高所执行代码性能的方法。
代码的读者永远不会猜到这样的事情。
finally的作用是:

finally块总是在try块退出时执行。这确保了finally块即使发生意外异常也会被执行。

而且

将清理代码放在finally块中始终是一种好的做法,即使在没有异常的情况下也是如此。

没有finally语句的第一段代码更加清晰,没有任何间接读取。

Foo result = array[index];
index = (index + 1) % array.length;
return result;  
 类似资料:
  • 在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异

  • 问题内容: 根据Java语言规范的第§14.20.2节 通过首先执行try块来执行带有finally块的try语句。然后有一个选择: 如果try块的执行正常完成,则执行finally块,然后可以选择: 如果finally块正常完成,则try语句正常完成。 如果finally块由于原因S突然完成,则try语句由于原因S突然完成 如果我正确地解释了它,那么在执行try块之后最终会被调用,但是所有这些如

  • 问题内容: 我刚遇到以下代码: 毫无疑问,运行此代码将产生“返回值:3”的输出。 但是,我对此感到好奇: JVM中的内部机制。有谁知道VM是否通过覆盖第一个“ return 1”来实际替换堆栈上的返回值?如果是这样,我在哪里可以找到更多信息。 我还没有找到以这种方式使用并允许在JVM中实现的final机制中的返回值的用法。如果将此代码构造用作返回错误代码的手段,我认为有更好的方法记录错误或返回这些

  • 我在类中使用下面的代码,允许用户设置声明的的第一点、第二点或第三点。 编译器告诉我: 但是我认为catch语句的目的是能够捕获错误并返回描述错误的字符串,而不必担心匹配函数的返回类型。

  • 本文向大家介绍try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?相关面试题,主要包含被问及try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?时的应答技巧和注意事项,需要的朋友参考一下 finally 一定会执行,即使是 catch 中 return 了,catch 中的 return