2012-07-26 60 views
4

我是一名.net開發人員。最近,我拿起了比較java和c#的興趣。我發現Java的使用塊的嘗試與資源相當於C#的。但是,我無法完全理解它。我知道C#的使用塊是一種語言功能,編譯器爲它生成代碼。我想獲得更多的理解嘗試,與資源和有它幾個問題:瞭解JDK 7 - 試用資源

  1. 它是類似的C#中使用塊的langauge功能?

  2. 什麼是以下等效JDK 6代碼:

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

    try(SomeResource resource = new SomeResource()) 
    { 
        //Some logic 
    } 
    catch(SomeException ex) 
    { 
    } 
    
  4. 什麼是Java相當於C#的反射器的或ILSpy工具?即反彙編Java字節代碼類文件並查看它的Java代碼的工具。

回答

6
  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 
} 
+0

關閉。資源的初始化由catch-SomeException塊覆蓋。此外,資源關閉邏輯發生在嵌套的try-finally塊內,因此如果引發SomeException,則資源在控制到達catch-SomeException塊之前關閉。有關血淋淋的詳細信息,請參閱JLS 14.20.3.2:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.20.3.2 – 2012-07-26 06:57:06

+0

@GaryF:在您的代碼片段中,應該不是SomeResource的構造函數在try塊中被調用,即不應該是:try {resource = new SomeResource()} .....? – 2012-07-26 08:27:23

+0

你們都是對的。它實際上涉及更多。我已經更新了我的答案。 – GaryF 2012-07-26 20:28:45