Java 如何确保一段代码在方法退出之前运行
我有一个if-else的方法,以及多个return语句,具体取决于具体的流 我有一行代码需要在return语句之前执行(例如releaseResources) 我想确保无论发生什么情况,都会执行这一行 在java中有没有一种很好的方法?Java 如何确保一段代码在方法退出之前运行,java,closures,Java,Closures,我有一个if-else的方法,以及多个return语句,具体取决于具体的流 我有一行代码需要在return语句之前执行(例如releaseResources) 我想确保无论发生什么情况,都会执行这一行 在java中有没有一种很好的方法? 确保在结束之前执行一段代码的东西 根据您使用的编程语言,try-catch最终存在: 当try-catch条件结束时,Finally语句将启动 很抱歉编辑您要查找的是一个try finally块。以下是一个例子: public Something someMe
确保在结束之前执行一段代码的东西 根据您使用的编程语言,try-catch最终存在: 当try-catch条件结束时,Finally语句将启动
很抱歉编辑您要查找的是一个try finally块。以下是一个例子:
public Something someMethod() {
try {
if(someStatement) {
return new Something();
} else {
return new SomethingElse();
}
} finally {
// this is always executed, even if there is an Exception
}
}
问题是这是否真的是你想要的。如果代码有两个方法,那么听起来您的代码实际上可能会更好(可读性更强)。像这样:
public Something createSomething() {
if(someStatement) {
return new Something();
} else {
return new SomethingElse();
}
}
public Something someMethod() {
Something something = createSomething();
// Do the thing that always needs to be done
return something;
}
这将您正在做的事情分为两种方法。现在,如果问题是第一个方法可以抛出异常,而您仍然想做一些事情,那么您仍然可以使用finally。但是捕获和处理异常可能更好
另外:您注意到要关闭一个资源。在这种情况下,我建议您研究一下try with resources:
这里举一个例子:
private String someMethod() throws IOException {
// Java automatically closes the following Readers:
try (BufferedReader br =
new BufferedReader(new FileReader("/path"))) {
return br.readLine();
}
}
如果您真的需要,可以使用
try/finally
块
try {
if (...) return ...;
else if (...) return ...;
else return ...;
} finally {
doSomething();
}
当您离开
try
块时,finally
块中的代码将始终执行,特别是在任何return
语句中。即使引发异常,也将始终执行finally
块
try {
...
if () {
return;
else {
return;
}
} finally {
// Release resources
}
一个主要的编程良好实践是,每个方法都应该有并且只有一个返回语句。如果您有许多可能的值,则倾向于将该值保留在对象中,并在最后返回该值 例如: 应该是这样做的
public int func(boolean condition) {
int num;
if(condition) {
num = 1;
} else {
num = 0;
}
return num;
}
正如您可能看到的,以这种方式确保在返回之前调用方法非常简单,将其添加到唯一的返回之前。使用try{}finally{}finally不仅适用于异常处理,它还允许程序员避免清除代码被返回、继续或中断意外绕过。
public int func(boolean condition) {
int num;
if(condition) {
num = 1;
} else {
num = 0;
}
return num;
}