int[][] a = new int[0][5];
为什么上面的代码在java中有效?
这个2D阵列几乎没用,因为第一个维度是ZERO。 从逻辑上讲,如果第一个维度为0,则第二个维度不应大于0.
我知道我们可以启动1d空数组。
答案 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中的其中一个: