【发布时间】:2012-02-10 11:06:21
【问题描述】:
我刚刚遇到以下代码:
public class TestFinally {
public static void main(String[] args) {
int returnValue = function();
System.out.println("Return value: " + returnValue);
}
public static int function() {
try {
return 1;
} catch (Exception e){
return 2;
} finally{
return 3;
}
}
}
毫无疑问,运行此代码将产生“返回值:3”的输出。
但是,我很好奇:
- JVM 中的内部机制。有谁知道虚拟机是否真的通过覆盖第一个“return 1”来替换堆栈上的返回值?如果是这样,我在哪里可以找到这方面的更多信息。
- 我还没有在 finally 机制中找到用于返回的用途,该机制以这种方式使用并允许在已实现的 在JVM中。如果将此代码构造用作返回的手段 错误代码,我认为有更好的方法来记录错误 或返回这些错误代码。有没有人发现这样的用途 构造?
非常感谢。
干杯, 维恩
【问题讨论】:
-
to 1.: 不知道,我也想知道。 to 2.: finally 可以用来做认为绝对需要做的事情,例如关闭流。我认为异常比错误代码更好,因为您已经在方法签名中看到了可能出错的地方(无需阅读任何文档),并且对于编码人员来说更难忽略它们。
-
嗯,我不能真正回答第一个问题,但第二个似乎很明显。 finally 子句用于清理(如关闭流),即使代码返回也必须进行清理。但是,在 finally 子句中返回无论如何都是不好的做法,只是不要这样做。
-
我认为您不应该在 finnaly 块内更改返回值,但是为什么他们应该允许您这样做呢?但这样做不是一个好习惯。
-
感谢大家的意见。是的,我意识到我发布的问题并不那么清楚。我已经编辑并澄清了这个问题。我很好奇是否有人见过这样的代码使用,即在 try 块中完成返回,在 finally 块中使用第二个返回来覆盖 try 块的返回值。有人见过这样的用途吗?
标签: java coding-style jvm