Java 当涉及来自finally块的返回值时,在try块中使用return语句是一种好的做法吗
我想知道,从Java 当涉及来自finally块的返回值时,在try块中使用return语句是一种好的做法吗,java,Java,我想知道,从try块返回是否是一种好的做法 package debug; /** * * @author Owner */ public class Main { public static void main(String[] args) { System.out.println(fun()); } static boolean cleanup() { // Fail to cleanup. return false; } static
try
块返回是否是一种好的做法
package debug;
/**
*
* @author Owner
*/
public class Main {
public static void main(String[] args) {
System.out.println(fun());
}
static boolean cleanup() {
// Fail to cleanup.
return false;
}
static boolean fun() {
boolean everything_is_fine = true;
try {
System.out.println("open file stream");
return everything_is_fine;
} finally {
everything_is_fine = cleanup();
}
}
}
我首先想到将打印false
。但是,以下是输出:
open file stream
true
如您所见,如果我在try
块中有return
语句,我将在finally
清理期间错过失败状态
我是否可以将代码设置为:
static boolean fun() {
boolean everything_is_fine = true;
try {
System.out.println("open file stream");
} finally {
everything_is_fine = cleanup();
}
return everything_is_fine;
}
只要涉及finally块返回的值,我是否应该避免try返回?您建议的代码(在问题的末尾)就可以了。您可以从finally
块返回,但不应该返回,例如eclipse显示警告“finally块未正常完成”
事实上,try/finally
与返回没有直接关系。这里看起来是这样的,因为它是方法中唯一的构造,但之后可以有其他代码(例如事件通知),然后返回
至于您的问题-如果已返回,finally
块中返回的变量的值不能更改。所以不要从返回,试试回答返回“true”的原因:
若变量是从try返回的,尽管返回的变量值在finally块中更改,但将返回以前设置的值(在本例中为try块中设置的值)。(当然,finally中没有返回语句)
回答您希望实现的目标:
若您希望更改finally块中要返回的值,则遵循第二种方法。i、 e:
static boolean fun() {
boolean everything_is_fine = true;
try {
System.out.println("open file stream");
} finally {
everything_is_fine = cleanup();
}
return everything_is_fine;
}
虽然这被认为是不好的做法,但您最终可以返回。这样做还胜过您在try
和catch
块中可能遇到的任何其他return
s。证明:
class Main
{
public static String test() {
try {
except();
return "return from try";
} catch (Exception e) {
return "return from catch";
} finally {
return "return from finally";
}
}
public static void except() throws Exception {
throw new Exception();
}
public static void main(String[] args) {
System.out.println(test());
}
}
将打印“最终返回”。在电视上看
始终执行finally
块(禁止调用System.exit()
或拔下电源插头)
编辑:注意,在您的第一个代码示例中,finally
块中没有返回任何内容,但是如果您在那里有一个return false
,那么您的方法将始终返回false。如果您需要返回依赖于finally块中运行的代码的内容,那么您需要将您的返回放在try块之外;正如其他人所说的,只有一个返回语句是一种好的做法
话虽如此,我从未遇到过返回值依赖于finally块中的计算的情况,我通常会将返回值放在try中。return
语句指示返回的值,而执行return
语句时返回的值是true
最后
确实会更改变量的值,但这不会更改已执行的return
语句返回的值
您可以在finally
中添加另一个返回值,该返回值将覆盖try
中的返回值:
static boolean fun() {
boolean everything_is_fine = true;
try {
System.out.println("open file stream");
return everything_is_fine;
} finally {
everything_is_fine = cleanup();
return everything_is_fine;
}
}
然而,使用finally
修改控制流被认为是不好的做法。当然,这是可能的。在您的情况下,更好的方法是:
static boolean fun() {
boolean everything_is_fine = true;
try {
System.out.println("open file stream");
} finally {
everything_is_fine = cleanup();
}
return everything_is_fine;
}
顺便说一句,变量名应更改为everythingIsFine
根据当前的;-) 在finally块中对所有内容的赋值都很好,不会影响返回的内容。在我看来这是一个糟糕的做法。意图是什么?@NullUserException请尝试同样的方法并予以批准。还有一些情况下,finally并不总是executed@NullUserException您正在展示的示例在finally中有“return”语句。我的回答的意思是,若变量是从try返回的,尽管在finally中该变量的值发生了更改,但会返回较早的值。当然,如果最终没有返回其他内容。将更新我的答案。@YoK我不知道你的意思。我想不出用try
块的返回值代替finally
块的返回值的方法。@YoK如果OP在finally
块中有一个return false
,该方法将返回false。当然,如果在<代码>中没有返回到最后的<代码>块,它将使用最后的返回(<代码>真/ <代码>从<代码>尝试/代码>块),尽管它可能从最后块返回,但我不认为它是好的实践。我在回答中也是这么说的。所以你们的回答并不相关,因为这个问题是关于良好实践的。此外,finally不会在比您所说的更多的情况下执行,例如:如果执行try或catch代码的线程被中断或终止,这意味着更多的是注释而不是答案,但是太长了,无法放入注释。所以您将注释放在了答案部分?告诉我你希望我做什么?@NullUserException我的意思是另一件事,在这个问题的上下文中,它应该是完全可见的。然而,我重新表述了最后一句话,这样即使在问题的上下文之外也是正确的。如果有疑问,请以明确、直观的方式编写代码。