为什么我可以在java中创建一个包含0行但是5列的二维数组?

时间:2017-12-03 20:20:42

标签: java arrays initialization

int[][] a = new int[0][5];

为什么上面的代码在java中有效?

这个2D阵列几乎没用,因为第一个维度是ZERO。 从逻辑上讲,如果第一个维度为0,则第二个维度不应大于0.

我知道我们可以启动1d空数组。

2 个答案:

答案 0 :(得分:6)

By the JLS,一个表示大小为零的数组表达式是有效的 - 它只是一个表达式 - 所以你可以合法地声明一个零基数的n维数组。

JLS词法分析器检查的唯一内容(从Java 8开始)是whether or not the expression evaluates to zero

  

接下来,检查维度表达式的值。如果任何DimExpr表达式的值小于零,则抛出NegativeArraySizeException。

这没有说明它的用处,因为我确定你知道,任何索引到这个数组的尝试都会产生ArrayIndexOutOfBoundsException,因为你的索引位置从零开始。

答案 1 :(得分:2)

将空数组视为正常情况并不奇怪。有一个非常类似的情况,我们一直处理空数组。

List<String> names = new ArrayList<String>();

names目前是一个空数组。总是用至少第一个元素声明数组会不会很奇怪?

List<String> names = new ArrayList<String>(Arrays.asList("John"));

new int[0]作为有效语法的替代方法是在第一个元素不可用时将数组设置为null。在这个世界中,我们需要在迭代数组之前定期检查null

int[] nums = null; // Because empty primitive arrays are "weird"

//typical for-each loop
if(nums != null){
    for(int x: nums){
        // do something
    }
}
//typical for loop
if(nums != null){
    for(int c = 0; c < nums.length; c++){
        // do something
    }
}

没有空数组,常规for循环会一直抛出NullPointerException。总而言之,使用new int[0][5]代替new int[0][]是很奇怪的。我不认为它值得语法错误,但我认为它值得IDE中的其中一个:

warning light