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

63

在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();
        }
    }
}

4
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html - gen_Eric
6
使用场景的好处是在try括号中打开的资源会自动关闭,无需在finally块中再次使用try catch。此外,catch块允许捕获多个异常,从而避免重复代码。 - Hunter McMillen
9
如果您熟悉C#,就会发现这与C#的using语句非常相似:http://msdn.microsoft.com/en-us/library/yh598w02.aspx - Kevin Crowell
2
请查看Java 7 SE新特性 - Eng.Fouad
1
@HunterMcMillen 谢谢Hunter,这是一个非常清晰简洁的解释。我确实尝试过在谷歌上搜索,但我不太确定该搜索什么,我没有意识到它可能已经在Java 7中添加了,我只是假设它一直存在,而我不知道它。 - Ali
8个回答

71

它是在Java 7中加入的,被称为try-with-resources语句。

/edit

如果使用类似这样的包装类,您可以使用try-with-resources语句来管理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

然而,由于您必须为每个资源声明一个变量,因此这种方法的优势是有争议的。


2
最好把这个扔在这里。意思是什么? - sofs1

10

6

这些是JDK7引入的更改。

第一个语句是try-with-resources。我不知道为什么它们存在,但异常通常是由输入流等引起的,我猜这只是提高了可读性。编辑:感谢其他回答者,我读了javadoc,现在知道它将关闭所有实现AutoCloseable的i/o流,在许多情况下省略了需要使用finally块的操作。

第二个是multi-catch,当您有不同的异常需要以完全相同的方式处理时,这非常方便。


2
只需使用它们:然后它们存在的目的就会变得清晰明了。 - user166390

3
与 C# 中的 using(Resource) 用法相同,意味着当你的程序离开此代码块时,该资源将自动回收(仅是我的观点)。
try-with-resources 语句确保在语句结束时关闭每个资源。任何实现 java.lang.AutoCloseable 接口的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。

try-with-resources 语句


顺便提一下,这个用法是在Java7中添加的。 - Chopping
那么资源会自动释放/关闭吗? - Flimtix

2
这被称为“try-with-resource”。这是一种不需要自己清理的方法,因为语言会替你完成。

1

它在Java 7中添加。它被称为“Try with resources”。Try with resources语句功能是在Java 7版本中引入的。Try with resource语句是一个try语句,声明了一个或多个语句。资源是程序使用后必须关闭的对象。

在Java 7之前,我们使用finally块来关闭程序中使用的资源。在finally块中,我们必须手动关闭程序中使用的所有资源。欲知详情,请访问Try with resources


0

try-with-resources语句是一个try语句,它声明了一个或多个资源。资源是程序在完成后必须关闭的对象。try-with-resources语句确保每个资源在语句结束时都被关闭。任何实现java.lang.AutoCloseable接口的对象,包括所有实现java.io.Closeable接口的对象,都可以用作资源。


0

这被称为具有资源的尝试。在具有资源的尝试中,声明在资源部分中的任何可关闭流都将在尝试语句完成后关闭。因此,这基本上是一个

try{
InputStream is;
//Stuff
}finally{
is.close()
}

实际上,它不仅仅是处理close()调用中的异常,而且以一种定义好的方式进行处理。如果只有这个作用,那么几乎没有引入它的理由。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接