当前位置: 首页 > 面试题库 >

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

郁明诚
2023-03-14
问题内容

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

问题答案:

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

/编辑

最好也把它扔在这里。Lock如果使用如下包装器类,则可以使用try-with-resources语句来管理:

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

但是,由于必须为每个资源声明一个变量,因此其优点值得商de。



 类似资料:
  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

  • 问题内容: 我通常对JOINS十分熟悉,但这是新的。 假设三个表(两个表的典型情况和第三个链接器表): (出于简化目的,我无法复制实际的结构,这不是我的代码。) 通常,要获得“谁在什么时候买了什么”的表格,我可以这样做: 但是我已经看到了这个: 这是什么?只是另一种语法,还是一种性能技巧? (它在SQLServer,FYI上,但是大概可以应用于其他…) 问题答案: 括号不会改变语义。子句的位置控制

  • 我查看了Java SE API 1.8所做的一些更改,当我查看新方法map.merge时,它展示了一个如何将其与下面一行一起使用的示例 我了解如何使用lambda表达式创建匿名函数接口,但这似乎是使用一个方法作为一个双重功能。我喜欢理解和使用晦涩难懂的java语法,但我在任何地方都找不到这一点。

  • 问题内容: 我今天看了一些Java代码,发现了一些奇怪的语法: 我以为无法编译,并想解决我认为是错字的问题,但是后来我想起Java编译器确实接受了它! 有人可以帮我理解它的意思吗?它是功能数组吗? 问题答案: 这是一个返回的方法。 Java语言规范(8.4方法声明) 为了与Java平台的较早版本兼容,允许使用返回数组的方法的声明形式(将部分或全部)空括号对放置在参数列表之后,该空括号对构成数组类型

  • 问题内容: 我在es-discuss邮件列表中遇到了以下代码: 这产生 为什么这是代码的结果?这里发生了什么事? 问题答案: 了解此“ hack”需要了解几件事: 为什么我们不只是做 如何处理论点 如何处理多个参数 函数如何处理参数 是什么呢 它们是javascript中相当高级的主题,因此它的时间要长得多。我们将从顶部开始。系好安全带! 1.为什么不只是? 什么是数组,真的吗?包含整数键的常规对

  • 我发现了Java并发的奇怪行为。请参阅下面的下一段代码: 在我看来,这段代码应该挂起并永远等待,但是在控制台中的next out没有任何问题地完成了代码: 我试图找到一些关于如果线程死了通知锁的信息,但缺乏。我也没有在Java规范中找到任何信息。 但是如果我试图锁定其他对象(而不是thread对象),就会像我预期的那样工作得很好。