3

假设一个getBar抛出检查异常的方法。它需要一个Foo. Foo 从未在代码中的其他任何地方使用过,它不会抛出异常,它唯一的工作是作为getBar. 应该foo在 try 内部还是外部声明和初始化?扩展问题 - 里面的代码应该try是最小的(作为我的第二个选项)还是包装一段类似的相关代码行(作为我的第一个选项)?

try {
   Foo foo = new Foo();
   var result = SomeConnection.getBar(foo);
   return result == foo.RESULT;
} catch ( .. ) {...}

OR

Foo foo = new Foo();
try {
   SomeConnection.getBar(foo);
   return result == foo.RESULT;
} catch ( .. ) {...}
4

4 回答 4

3

try使用您的代码,最小化块内的代码量不会出现性能问题。(最小的)性能影响都在于进入和退出try块本身。

编辑:如果Foo是实现的东西java.lang.AutoCloseable(包括任何实现的东西java.io.Closeable),你应该使用“try-with-resources”语句

try (Foo foo = new foo()) {
    var result = SomeConnection.getBar(foo);
    return result == foo.RESULT;
} catch (...) {...}

请注意,这个 Java 7 语言结构清楚地使块foo本地化try

于 2013-11-13T02:44:01.770 回答
1

除了 Ted 的回答之外,如果它具有可能引发异常的构造函数逻辑,您会将其foo放入块内部。try除此之外,在性能方面没有区别。我个人会使用您的第一个版本并保持foo在我使用它的范围内。就最佳实践而言,我认为在您的 try/catch 中包含“最少”代码不会有很大的不同。另一方面,有太多的 try/catch 块(或者更糟糕的是,让它们嵌套)是一种不好的做法。

于 2013-11-13T02:46:40.013 回答
0

在 try/catch 中包装额外的东西不一定是坏事,但在某些语言中,抛出的是不同的异常类型(例如 ExceptionInvalidParameter、ExceptionUnknown,...),并且每种类型可以有多个 catch 块。我喜欢在 try/catch 中包装大量的东西,并有一个 finally 语句来处理意外异常。

于 2013-11-13T02:44:35.920 回答
0

您的程序将始终执行Foo foo = new Foo(),因此您无法在那里获得性能,您可以做的是最小化您的代码:

SomeConnection.getBar(new Foo())

假设foo.RESULT是一个常量,它可能是一个静态常量Foo.RESULT

于 2013-11-13T02:45:20.303 回答