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

2022-08-31 16:25:37

在 Eclipse 中的自定义格式设置选项中,在其中一个示例代码片段中,我看到了如下代码:

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

        }
    }
}

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

我看到的另一段代码,我认为这是一个非常有用的速记,所以我也在这里分享它,它的作用是显而易见的:

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

答案 1

它是在Java 7中添加的。它称为“使用资源试用”语句。

/编辑

不妨把这个也放在这里。如果使用如下包装类,则可以使用 try-with-resources 语句来管理 s:Lock

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

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