Java中数组初始值设定项中带有尾随逗号的数组

Posted

技术标签:

【中文标题】Java中数组初始值设定项中带有尾随逗号的数组【英文标题】:Arrays with trailing commas inside an array initializer in Java 【发布时间】:2012-07-22 05:49:45 【问题描述】:

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

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[][] = , ,, , ,,; 

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

【问题讨论】:

忽略尾随逗号。语言允许这样做,因为有些人觉得它很方便。 @Daniel 好吧,它在向数组添加内容时使差异更加简洁,允许轻松重新排序数组表达式,并一次性为该语言提供更简单的语法。我看不出有很多优点,但没有缺点。 @Voo 如何让语法更简单?如果尾随逗号是强制性的,那会更简单,但是如果有一个可选的尾随逗号,我看不到它。我也看不到差异更简洁。重新排序,是的。 @Daniel 对,你是关于语法的,我忘了它们仍然是可选的。关于差异:假设对于较大的数组,每个项目都有自己的行(我经常看到,虽然它并不总是明智的,但在很多情况下它很有用 - 也为 cmets 留出了位置,而不诉诸 /* */ 内联) .添加一个新行然后只会更改差异中的一行,没有它你必须更改两个。 @Voo 我明白了。但是,如果您以 Haskell 样式布置数组,并使用前导逗号,它不会更改两行 - 除非您在第一个位置添加一个条目,但这比在末尾添加要少得多。 【参考方案1】:

后面的逗号被忽略。来自Java specification:

尾随逗号可能出现在数组初始值设定项中的最后一个表达式之后并被忽略。

【讨论】:

附带说明:即使在 JLS 1.0 titanium.cs.berkeley.edu/doc/java-langspec-1.0 中也存在上述声明(回到 Java 1.0),因此我们可以放心地说“它一直都在那里”。

以上是关于Java中数组初始值设定项中带有尾随逗号的数组的主要内容,如果未能解决你的问题,请参考以下文章

数组和对象中的尾随逗号是规范的一部分吗?

数组和对象中的尾随逗号是规范的一部分吗?

您可以在 JSON 对象中使用尾随逗号吗?

删除尾随逗号 - (在问这个之前我做了研究,相信我。)

构造函数初始值设定项列表中长度未知的数组

字符数组的文字字符串初始值设定项