新的/奇怪的Java"try()"语法?

Ali*_*Ali 53 java syntax try-catch

在使用Eclipse中的自定义格式选项时,在其中一个示例代码中,我看到了如下代码:

/**
 * 'try-with-resources'
 */
class Example {
    void foo() {
        try (FileReader reader1 = new FileReader("file1"); FileReader reader2 = new FileReader("file2")) {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我从来没有见过这样的try用法,我已经用Java编写了9年!有人知道你为什么要这样做吗?这样做的用例/好处是什么?

我看到的其他代码片段,我认为这是一个非常有用的简写,所以我也在这里分享它,它的作用非常明显:

/**
 * 'multi-catch'
 */
class Example {
    void foo() {
        try {
        } catch (IllegalArgumentException | NullPointerException | ClassCastException e) {
            e.printStackTrace();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*rey 63

它是在Java 7中添加的.它被称为try-with-resources语句.

/编辑

不妨把它放在这里.Lock如果使用这样的包装类,可以使用try-with-resources语句来管理s:

public class CloseableLock implements Closeable {
    private final Lock lock;

    private CloseableLock(Lock l) {
        lock = l;
    }

    public void close() {
        lock.unlock();
    }

    public static CloseableLock lock(Lock l) {
        l.lock();
        return new CloseableLock(l);
    }
}

try(CloseableLock l = CloseableLock.lock(lock)) { // acquire the lock
    // do something
} // release the lock
Run Code Online (Sandbox Code Playgroud)

但是,由于您必须为每个资源声明一个变量,因此这一点的优点是值得商榷的.

  • 为"不妨把它扔在这里"的+1 (5认同)
  • “不妨把这个扔在这里”——这是什么意思? (2认同)

Mar*_*oDS 6

这些是JDK7中引入的变化.

第一个声明是尝试资源.我不确切知道它们存在的确切原因,但是输入流等常常会导致异常,我想它只是提高了可读性.编辑:感谢其他的回答者,我读了javadoc,我现在知道它将关闭所有实现AutoCloseable的i/o流,finally在很多情况下省略了块的需要

第二个是多捕获,当您以完全相同的方式处理不同的异常时,这非常方便.

  • 只需使用它们:**然后**它们存在的目的将变得清晰. (2认同)