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

问题描述 投票:6回答:2
int[][] a = new int[0][5];

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

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

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

java arrays initialization
2个回答
6
投票

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

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

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

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


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循环会一直抛出NullPointerExceptions。所有这一切,使用new int[0][5]而不是new int[0][]是奇怪的。我不认为它值得语法错误,但我认为它值得IDE中的一个:

warning light

© www.soinside.com 2019 - 2024. All rights reserved.