Java中数组初始化器中带有尾随逗号的数组。

26

数组初始化器可以用于在编译时初始化数组。如下所示带有尾随逗号的初始化器可以正常编译。

int a[][] = {{1,2,} ,{3,4,} , {5,6,},}; //Trailing commas cause no compiler error

for(int i=0;i<a.length;i++)
{
    for(int j=0;j<2;j++)
    {
        System.out.print(a[i][j]+"\t");
    }
    System.out.println();
}

输出:

1        2        
3        4        
5        6     

与上述讨论中一维数组一样,对于一个维度的数组也是合法的。

int[] b = {1, 2, 3, 4, 5, 6,}; //A trailing comma causes no compiler error

for(int i=0;i<b.length;i++)
{
    System.out.print(b[i]+"\t");
}

输出:

1        2        3        4        5        6

即使以下语法是合法的并且可以编译通过。
int c[][] = {{,} ,{,} , {,},}; 

编译器应该在逗号,前后期望一个常量值(或另一个初始化程序)。这是如何编译的?编译器会忽略这样的逗号,还是在这种情况下会发生其他事情?

2
末尾逗号会被忽略。由于一些人认为它很方便,因此语言允许使用它。 - Daniel Fischer
3
@Daniel,当向数组添加元素时,它可以使差异更简洁,允许轻松重新排序数组表达式,并在一次操作中实现语言的简化语法。我看不到任何缺点,这带来了相当多的优势。 - Voo
1
@Daniel 没错,你在语法方面是正确的,我忘记它们仍然是可选的。关于差异:假设对于较大的数组,每个项都占据一行(我经常看到这种情况,虽然不总是有意义,但有很多情况下很有用 - 这也为注释提供了空间,而无需使用 /* */ 内联)。那么,添加新行只会在差异中更改一行,如果没有它,你将不得不更改两行。 - Voo
@Daniel 是的,那个方法可以用,但是对我来说那种风格看起来很奇怪,特别是因为其他语言的样式指南(从未编写过单行 haskel 和 lisp 避免了这个问题)通常更喜欢在行末放置运算符(例如 x && \\y 而不是 x \\ && y;或者英语中你也会把标点留在行末);但它有助于重新排序和添加结尾的内容。像往常一样,解决问题有多种方案,具有不同的权衡。 - Voo
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/14314/discussion-between-daniel-fischer-and-voo - Daniel Fischer
显示剩余2条评论
1个回答

38

末尾的逗号会被忽略。根据Java规范

在数组初始化器中,最后一个表达式后可以出现逗号,但会被忽略。


6
顺便提一下:上述陈述甚至出现在JLS 1.0中http://titanium.cs.berkeley.edu/doc/java-langspec-1.0/(追溯到Java 1.0),因此我们可以安全地说“它一直存在”。 - user719662

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接