【问题标题】:Understanding JDK 7 - try-with-resources了解 JDK 7 - try-with-resources
【发布时间】:2012-07-26 06:23:27
【问题描述】:

我是一名 .net 开发人员。最近,我对比较 java 和 c# 产生了兴趣。我发现 Java 的 try-with-resources 相当于 C# 的 using 块。但是,我无法完全理解它。我知道 C# 的 using 块是一种语言功能,编译器会为它生成代码。我想对 try-with-resources 有更多的了解,对此我有几个问题:

  1. 是不是类似于 C# 的 using 块的语言特性?

  2. 以下等效的 JDK 6 代码是什么:

    try(SomeResource resource = new SomeResource())
    {
        //Some logic
    }
    
  3. 以下等效的 JDK 6 代码是什么:

    try(SomeResource resource = new SomeResource())
    {
        //Some logic
    }
    catch(SomeException ex)
    {
    }
    
  4. 什么是 C# 的 Reflector 或 ILSpy 工具的 Java 等价物?即反汇编Java字节码类文件并查看其Java代码的工具。

【问题讨论】:

    标签: c# java java-7 try-with-resources


    【解决方案1】:
    1. 是的,非常相似。
    2. 等效的java代码完全相同
    3. 等效的java代码也是一样的
    4. 有一些Java反编译器,但我很喜欢JD-GUI

    更新:我误读了您的问题。 JDK6 代码看起来像

    try {
        final SomeResource resource = new SomeResource();
        Throwable resourceEx = null;
        try {
          //... use resource
        } catch (Throwable t) {
            resourceEx = t;
            throw t;
        } finally {
    
            if(resource != null) {
                if(resourceEx != null) {
                    try {
                        resource.close();
                    } catch (Throwable t) {
                        resourceEx.addSuppressed(t);
                    }
                } else {
                    resource.close();
                }
            }
        }
    } catch (SomeException ex) {
    //...standard error handling
    }
    

    【讨论】:

    • 关闭。资源的初始化由 catch-SomeException 块覆盖。此外,资源关闭逻辑发生在嵌套的 try-finally 块中,因此如果抛出 SomeException,则在控制到达 catch-SomeException 块之前关闭资源。有关详细信息,请参阅 JLS 14.20.3.2:docs.oracle.com/javase/specs/jls/se7/html/…
    • @GaryF:在您的代码 sn-p 中,不应在 try 块中调用 SomeResource 的构造函数,即不应该是:try { resource = new SomeResource() }..... ?
    • 你说的都是对的。它实际上涉及更多。我已经更新了我的答案。
    • @GaryF:在你的代码 sn-p 中什么是 gzip 和 gzipEx,声明在哪里?
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2013-07-13
    相关资源
    最近更新 更多