Java try-with-resources语法不规则

时间:2011-07-28 23:35:41

标签: java syntax java-7 try-with-resources

所以我正在研究java 7的一些新功能,包括try-with-resources位。

我理解它是如何工作的以及一切,我只是注意到用于指定资源的语法有点奇怪。

try 
    (InputStream fis = new FileInputStream(source);
        OutputStream fos = new FileOutputStream(target))
    {
            // stuff
        }
    }
    catch (Exception e) {
        // stuff
    }

具体来说是资源的定义:

try (InputStream fis = new FileInputStream(source);
        OutputStream fos = new FileOutputStream(target))

在java中,括号内的分隔语句是否有效,是否还有其他地方?

我唯一能想到的是for循环

for ( ; ; )

但这并不完全相同,因为必须有2个;,并且语句用,分隔,如

for (int i = 1,  j = 100;  i <= 100, j > 0;  i = i-1, j = j-1)

所以我的问题是,这种语法来自哪里?是否有理由将语句;分隔而不是,分隔?是否有另一种类似的语言在;块内部使用()个分隔语句?我想不出java,C或python中的例子。

2 个答案:

答案 0 :(得分:7)

通常,语句在Java中以分号结束。请注意,try-with-resources与int i = 1, j = 100;之类的赋值不同,因为它不要求每个被初始化的东西都是相同的类型。它实际上只是括在括号中的一系列赋值语句。

那就是说,如果容易理解,我认为使用某种语法确实不需要任何先例。

答案 1 :(得分:0)

嗯,它没有分号,但Common Lisp有几个遵循这种模式的结构。例如,将一些值绑定到有限范围内的变量(基本上是“尝试使用资源”):

(let (x 5) (y 10) (z 100)
  (...))

它有类似的条件(异常)处理的东西,你也可以根据需要编写自己的构造,看起来可能看起来一样。如果您将(x 5)想象为int x = 5;,则可以看到并行。