为什么java允许零长度索引(中间)数组?

为什么java允许零长度索引(中间)数组?,java,arrays,Java,Arrays,javac允许以下语法 int[][][] i = new int[4][0][2]; 它具有零长度索引,可防止访问超出 1) 没有办法进入三维空间。长度为零的维度作为最后一个维度(int[]i=new int[4][2][0];)看起来不错 2) 除非维度是最后一个维度(例如int[2][3][0]),否则无法为长度为零的多维数组编写初始化器 为什么java允许这样的语法 注意:这个问题与int[0]无关,我同意@m0skit0-我认为这是一个重复的问题。无论如何,我会给出一个简短的回答 基

javac
允许以下语法

int[][][] i = new int[4][0][2];
它具有零长度索引,可防止访问超出

1) 没有办法进入三维空间。长度为零的维度作为最后一个维度(
int[]i=new int[4][2][0];
)看起来不错

2) 除非维度是最后一个维度(例如
int[2][3][0]
),否则无法为长度为零的多维数组编写初始化器

为什么java允许这样的语法


注意:这个问题与
int[0]

无关,我同意@m0skit0-我认为这是一个重复的问题。无论如何,我会给出一个简短的回答

基本上,它是null的一种替代方法。简单地说,您有一个返回数组的方法,但是它没有返回的值。您可以返回null,但必须检查代码中的null。另一方面,可以返回长度为0的数组。将自动跳过以下代码

for(int p = 0; p < array.length; p++) {
for(int p=0;p
没有比这更好的答案了……事实是,对于任何
X
,即使
X
是一个原语,那么
X[]
是一个类,
X[][]
是一个类等等;您可以自由选择数组的“维度”

请注意声明
X[n][]
X[n][m]
数组的不同之处:在第一个数组中,您将声明
anewarray
of
X[]
而在第二个数组中,您将声明
multianewarray
of
X

当然,在
X[m][n][p]
中,如果
n
为0,就不可能有“三维”(p),但是……程序员知道他在做什么,对吗


JVM中数组的另一个奇怪之处是……除了“它可能发生”之外,不要考虑它;)

所以你可以做完全可以接受的事情,比如:

public static final int[][][] EMPTYARRAY = new int[0][0][0];
注意,事情比你想象的要糟糕得多,因为这也是合法的:

public static final int[] SCREWEDARRAY = new int[-1];
这会导致运行时出现错误:

java.lang.ExceptionInInitializerError
Caused by: java.lang.NegativeArraySizeException

首先,它不只是在“中间”。你可以很容易地定义一维数组,同样也很容易:

int[]a=新的int[0];


第二,长度为零的数组有点像一个空集合。它是一个合法的数据结构,可能由一个方法返回,但恰好是空的。

可能重复@m0skit0我知道长度为零的数组的优点,请阅读问题我想这正是主要的问题,为什么它应该是可能的-它不是just在“中间”。你也可以定义一个长度为零的一维数组:
int[]a=new int[0];
@overexchange,它实际上回答了你的问题。想想看。这回答了另一个问题。你是指长度为0的数组和具有单个(或多个)的多维数组之间的区别吗长度为0的索引?如果是这样的话,我觉得它们不是,更不用说提供的答案也回答了这两个问题。再次-假设这就是您所指的。语法是合法的,并且有其目的,您已经解释过了。但是
int[0][1]
看起来很荒谬。问题是:为什么它确实合法?它看起来很荒谬,但事实并非如此。我只是想象两种情况都会出现类似的情况——例如,读取可能最终成为一维或二维数组的信息。但我明白你的意思。