尝试阻止结束,还是在所有阻止之后?
我在堆栈溢出上读了很多关于每种情况会发生什么的答案。但是,我无法找出哪一个是普遍接受的“更正”的地方。
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;
答案 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对象模式。