在try块中使用return(Java)

时间:2014-07-23 11:08:49

标签: java

我有一个try块,用于尝试运行数据库查询,还有一个finally块,用于释放数据库资源。如果数据库中不存在值,则返回null。

在try块中返回是个好主意吗?

一些示例代码:

    try {
        if (!jedis.exists(name)) {
            return null; // Is this a good idea?
        }

        // Do database related stuff...
    } catch (JedisConnectionException e) {
        // Fix any problems that happen
    } finally {
        // Return all objects to pools and clean up
    }

7 个答案:

答案 0 :(得分:8)

  

在try块中返回是个好主意吗?

绝对:如果要返回的对象的准备完全符合try块的范围,则没有理由将其可见性扩展到其自然边界之外。

作为一个例子,这个

try {
    ReturnType ret = ...
    // Compute ret
    return ret;
} catch {
    ...
} finally {
    ...
}

比这更好

ReturnType ret = ...
try {
    // Compute ret
} catch {
    ...
} finally {
    ...
}
return ret;

答案 1 :(得分:0)

即使使用return语句,也会执行finally块。

只有在调用System.exit(0);

时才会执行finally块

因此,您可以在finally块中使用清理代码。

然而,使用return取决于您的解决方案设计等其他内容。

答案 2 :(得分:0)

只要最终确实必须运行即使!jedis.exists(name)评估为真,这不仅是一个好主意,它实际上是必须的。例如,如果你有一个像jedis.connect()这样的行(不是真正的代码,只是一个例子),那么if应该在try中,最后应该调用jedis.disconnect。但是如果你的finally中的代码完全依赖你将在检查之后做什么,那么在尝试之前if会更有意义。

答案 3 :(得分:0)

这取决于你的情况并不重要,但作为一般规则,请考虑这个例子:

String returnString="this will be returned";
try
{
    // ... something that could throw SomeException
    return returnString;
}
catch(SomeException ex)
{
    // Exception handling
}
finally
{
   returnString="this will not be returned";
}

这可能会让人感到困惑,因为无论最终想要做什么,返回的字符串都是“这将被返回”。

答案 4 :(得分:0)

考虑这个例子。即使您在finally块中返回,也会执行try块。最好在finally block中返回以获得更好的readability代码。您可以追溯返回值的位置,否则您最终可能会遇到一些问题。

public static void main(String[] args) {
        System.out.println(someMethod());
    }

    private static boolean someMethod() {
        try {
            System.out.println("in try");
            return true;
        } catch (Exception e) {

        } finally {
            System.out.println("in finally");
            return false;
        }

    }

O / P:

in try
in finally
false -- > not true, but false

答案 5 :(得分:0)

可以从try块重新计算一个值。

在您的实施中也考虑这种情况。

private static int testFinally() {
        try {
            return 100;
        } finally {
            return 101;
        }
    }

这里的值是从try块返回的,最后是块。首先它将执行try块但在返回之前它应该执行finally块。所以这个方法将从finally块而不是100返回101.

因此,从finally块返回可能会为随意读者带来意想不到的结果。

在我看来

最好在Try块

中返回值

如果出现异常,则返回Catch块内的默认值/适当值。

只在finally块中进行清理。

答案 6 :(得分:0)

一般来说,从try-block返回没有任何问题。但是,保持块短路是一种好习惯,因此在try块中包含不相关的代码并不是很好。

以下情况可能会有所改善:

// assuming a String result type for sake of demonstration
String result = null;
if (jedis.exists(name)) {        
    try {
        result = jedis.getResult(name);
    } catch (JedisConnectionException e) {       
        LOG.error("Could not get result", e);
    } finally {
        jedis.close();
    }
}
return result;

你可能无法修复' JedisConnectionException所以我要记录(如上所示)或重新抛出:

throw new MyAppException("Could not get result, e);

不要记录并重新抛出,它会给你和其他人带来麻烦。

如前所述,如果JedisConnection是Closable,您还可以在Java SE 7中使用try-with-resources:

    try (JedisConnection jedis = Pool.getJedisConnection()) {
        result = jedis.getResult(name);
    } catch (JedisConnectionException e) {       
        LOG.error("Could not get result", e);
    } 

这将在处理完成后自动关闭JedisConnection。