我有一个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
}
答案 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。