如何确保在方法退出之前运行一段代码



我有一个带有if-else情况的方法,以及多个返回语句,具体取决于具体的流。

我有一行代码需要发生在return语句之前(例如releaseResources)。

我想确保这一行无论如何都能执行。

在java中有一种很好的方法可以做到这一点吗?确保在离开闭包之前执行一段代码的东西?

您想要的是一个try-filly块。这里有一个例子:

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。但捕获并处理异常可能会更好。

另外:您已经注意到您想要关闭一个资源。在这种情况下,我建议您考虑使用资源:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

这里有一个例子:

private String someMethod() throws IOException {
    // Java automatically closes the following Readers:
    try (BufferedReader br =
               new BufferedReader(new FileReader("/path"))) {
        return br.readLine();
    }
}

根据您使用的编程语言,try-catch最终存在:

来自其他帖子的关于if-else 之后的启动代码的示例

当try-catch条件结束时,Finally语句将启动

抱歉编辑

如果您真正想要的话,可以使用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) {
    if(condition) {
        return 1;
    } else {
        return 0;
    }
}

应该像这个一样制作

public int func(boolean condition) {
    int num; 
    if(condition) {
        num = 1;
    } else {
        num = 0;
    }
    return num;
}

正如您可能看到的,通过这种方式确保在返回之前调用方法,并在唯一返回之前添加它,这非常简单。

相关内容

最新更新