了解 JDK 7 - try-with-resources

Posted

技术标签:

【中文标题】了解 JDK 7 - try-with-resources【英文标题】:Understanding 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 有更多的了解,对此我有几个问题:

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

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

    try(SomeResource resource = new SomeResource())
    
        //Some logic
    
    

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

    try(SomeResource resource = new SomeResource())
    
        //Some logic
    
    catch(SomeException ex)
    
    
    

    什么是 C# 的 Reflector 或 ILSpy 工具的 Java 等价物?即反汇编Java字节码类文件并查看其Java代码的工具。

【问题讨论】:

【参考方案1】:
    是的,非常相似。 等效的java代码完全相同 等效的java代码也是一样的 有一些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,声明在哪里?

以上是关于了解 JDK 7 - try-with-resources的主要内容,如果未能解决你的问题,请参考以下文章

JDK1.7 HashMap 源码分析

JDK11的新特性你了解了吗?JDK12已经来了!13还远吗?

CentOS 7 Minimal 安装JDK 1.8

一文带你了解solr部署全过程(word免费送)

Dubbo 2.7.3源码分析——JDK SPI篇

JDK源码ConcurrentHashMap源码分析