在try / finally外部或内部初始化一次性资源

我已经看到了两种获取和处理资源的方法。 或者:

Resource resource = getResource(); try { /* do something with resource */ } finally { resource.close(); } 

要么:

 Resource resource = null; try { resource = getResource(); /* do something with resource */ } finally { if (resource != null) resource.close(); } 

我想知道哪种风格更可取。 第一个避免if条件,而第二个(我假设)在赋值之后但在进入try块之前处理线程中止的情况。 这些风格有什么其他优点和缺点? 我最好使用哪一个?

在C#中,只需使用using语句:

 using (Resource resource = GetResource()) { /* Do something */ } 

在分配和进入try块之间没有发生Java线程中止的风险 – 中止只发生在hibernate和等待期间。 编辑:我实际上无法在规范中找到这个,这有点令人担忧。 嗯。

第一个是可取的

如果getResource()抛出exception,那么资源将为null, getResource()在exception的情况下不返回任何内容。 因此,只要getResource()可以抛出exception,在调用resource.close()之前总是检查null。 我觉得组织这段代码的最好方法是将所有内容放在try块中; 清楚地表明getResource()会抛出exception。