【问题标题】:New/strange Java "try()" syntax?新的/奇怪的 Java “try()”语法?
【发布时间】:2012-04-11 23:14:04
【问题描述】:

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

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

        }
    }
}

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

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

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

【问题讨论】:

  • 用例的好处是您在 try parens 中打开的资源会自动为您关闭,而无需在 finally 块中再次尝试捕获。此外,catch 块允许多个异常,因此您可以避免重复代码。
  • 很像C#的using语句,如果你熟悉C#的话:msdn.microsoft.com/en-us/library/yh598w02.aspx
  • @HunterMcMillen 感谢 Hunter,这是一个非常清晰简洁的解释。我确实尝试用谷歌搜索它,但我不太确定用谷歌搜索什么,我没有意识到它可能是在 Java 7 中添加的,我只是假设它一直在那里,我只是不知道它.

标签: java syntax try-catch


【解决方案1】:

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

/编辑

不妨把这个也扔在这里。如果你使用这样的包装类,你可以使用 try-with-resources 语句来管理Locks:

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】:

【讨论】:

    【解决方案3】:

    这些是 JDK7 中引入的更改。

    第一个语句是 try-with-resources。我不知道它们存在的确切原因,但异常通常是由输入流等引起的,我想它只是提高了可读性。编辑:感谢其他回答者,我阅读了 javadoc,现在我知道它将关闭所有实现 AutoCloseable 的 i/o 流,在很多情况下都不需要 finally

    Second 是一个 multi-catch,当你有不同的异常并以完全相同的方式处理时,它真的很方便。

    【讨论】:

    • 只要使用它们:那么它们存在的目的就会变得清晰。
    【解决方案4】:

    它被称为 try-with-resource。这是一种不必自己清理的方法,因为语言会为你做这件事。

    【讨论】:

      【解决方案5】:

      C Sharp 中的using(Resource) 用法相同,这意味着当您的程序离开此代码块时,此资源将自动回收。(只是我的意见)

      try-with-resources 语句确保每个资源在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源

      The try-with-resources Statement

      【讨论】:

      • 顺便说一下,这个用法是在Java7中添加的。
      【解决方案6】:

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

      在 java 7 之前,我们使用 finally 块来关闭我们在程序中使用过的资源。在 finally 块中,我们必须手动关闭我们在程序中使用的所有资源。 欲了解更多信息,您可以访问try with resources

      【讨论】:

        【解决方案7】:

        这是通过资源尝试调用的。在使用资源的尝试中,在资源部分中声明的任何类型的可关闭流都将在尝试语句完成后关闭。所以它几乎是一个

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

        【讨论】:

        • 实际上远不止于此,它还以定义的方式处理close()调用中的异常。如果只有这个,那几乎没有理由介绍它。
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-24
          • 2012-06-25
          • 2013-09-05
          • 2017-12-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多