try-finally with close auto-refactoring to try-with-resources with codestyle/checkstyle

try-finally with close auto-refactoring to try-with-resources with codestyle/checkstyle

我正在开发最近从 Java 6 迁移到 Java 7 的代码库。我想替换这样的结构:

Connection conn = null;
try{
    conn = new Connection();
    ...
} catch(Exception ex){
    ...
} finally{
    if (conn != null){
        conn.close();
    }
}

try-with-resources(从 Java 1.7 开始可用):

try(Connection conn = new Connection()){
    ...
} catch(Exception ex){
    ...
}

是否有自动将旧的重构为新的方法(可能使用 Checkstyle 插件,或者在 Eclipse 本身中)?

很难快速改变这一切。请注意,有时 finally 中还有另一个 try-catch 块,它捕获关闭资源时抛出的异常。

try-with-resources 语句允许您处理资源关闭异常(在 close 方法中抛出的异常将被抑制)。

我还没有听说过这样的 Eclipse 功能,但是如果您可能想使用 IntelliJ IDEA Community Edition IDE 只是为了这个目的。

#1

您可以使用名为:

的代码检查功能
  1. 'try finally' replaceable with 'try' with resources
  2. AutoCloseable used without 'try' with resources

你只需要按Ctrl+Alt+Shift,输入检查名称并点击输入。之后您将看到 IDEA 可以应用此模式的地方,但请注意它并未涵盖 100% 的情况。

#2

另一种方法,更困难,但可高度自定义的是 Structural Search and Replace 功能。您可以定义要更改的结构:

try {
    $type$ $objectName$ = new $concreteType$($args$)
    $tryStatements$;
} catch($exceptionType$ $exceptionName$) {
    $catchStatements$;
} finally {
    $finallyStatements$;
}

最终结构:

try ($type$ $objectName$ = new $concreteType$($args$)) {
  $tryStatements$;
} catch($exceptionType$ $exceptionName$) {
    $catchStatements$;
}

在变量设置中,您可以要求 $concreteType$ 实现 AutoCloseable 接口。

但请注意:

  1. 这里去掉了finally块,支持单个catch块。
  2. 还假设每个 try-with-resources 块将打开一个资源。
  3. 如前所述 - finally 块中没有异常处理。

这个模板当然需要更多的工作,而且这样做可能不值得。