在哪里,#34;正确的地方"最后把try语句放在try catch中

时间:2014-05-28 19:01:57

标签: java return try-catch

尝试阻止结束,还是在所有阻止之后?

我在堆栈溢出上读了很多关于每种情况会发生什么的答案。但是,我无法找出哪一个是普遍接受的“更正”的地方。

Object o = null;
try {
  Connection c = getConnection();
  o = c.getThing();
  return o;
} catch (Exception e) {
  //handle exception
  return null;
} finally {
  c.close();
}

vs

Object o = null;
try {
  Connection c = getConnection();
  o = c.getThing();
} catch (Exception e) {
  //handle exception
  return null;
} finally {
  c.close();
}
return o;

1 个答案:

答案 0 :(得分:2)

这完全取决于你想要做什么。有关可能性的一些示例,请参阅以下代码(并非所有这些示例都应合并在任何一段代码中!)。

try {
    // do something that may fail
    return 0; // return a normal value
} catch(SomeException e) {
    // maybe log an error
    return -1 // maybe return a default or error value
} finally {
    // maybe clean up resources
    // finally will be executed even if you return in try or catch
    // a return here will trump a return in try/catch. This is generally regarded as a bad idea
    // see https://stackoverflow.com/questions/65035/does-finally-always-execute-in-java
}
return 1 // return a normal value here instead of in the try/catch.
// May be clearer than multiple return statements  
// Also useful if return value does not depend on the try/catch outcome

更新以获取更新后的问题。虽然每种选择都有重要原因,但这部分是一个偏好问题。许多人更喜欢单点返回,所以会这样做:

Object o = null;
try {
  Connection c = getConnection();
  o = c.getThing();
} catch (Exception e) {
  //handle exception; leave o as null
} finally {
  c.close();
}
return o;

虽然这听起来应该更清楚,但当然仍然需要检查代码以确定o可能最终得到的值,因此优势并不大。

但是,其他选项的优点是null的返回非常明确。如果您是许多程序员中的一员,他们认为返回null值通常是一个坏主意(参见Tony Hoare&#34; billion dollar mistake&#34;)。< / p>

可以使用&#34; Optional&#34;,&#34; Option&#34;而不是返回null。或者&#34;可能&#34;类型(在例如Java 8,Scala,Haskell和Functional Java库中可用),或使用Null对象模式。