2012-07-17 163 views
24

我经历了他们所创建的输出流的一个开源项目,并遇到下列方法来:Java数组长度小于0?

@Override public void write(byte[] buffer, int offset, int length) { 
    if (buffer == null) { 
     throw new NullPointerException("buffer is null"); 
    } 
    if (buffer.length < 0) { // NOTE HERE 
     throw new IllegalArgumentException("buffer length < 0"); 
    } 
    if (offset < 0) { 
     throw new IndexOutOfBoundsException(String.format("offset %d < 0", offset)); 
    } 
    if (length < 0) { 
     throw new IndexOutOfBoundsException(String.format("length %d < 0", length)); 
    } 
    if (offset > buffer.length || length > buffer.length - offset) { 
     throw new IndexOutOfBoundsException(String.format("offset %d + length %d > buffer"              " length %d", offset, length, buffer.length)); 
    } 
} 

所以byte[] buffer只是一个普通的老byte[]。我们知道它不是空的。它甚至有可能使它的长度小于0吗?喜欢,可以用反射完成,这就是他们所防范的?

+0

你是什么意思“我们知道它不是'null'”? – 2012-07-17 20:02:05

+3

@EdwardThomson:我认为是因为第一条语句检查'buffer == null' – 2012-07-17 20:02:51

+0

也许在该项目的其他地方,它是一个约定,'-1'是一种有效的方式来表示索引是无效的或类似的这里终于变成了一个例外。 – thalador 2012-07-17 20:03:28

回答

29

不,这不会发生。根据Java规范,长度保证是非负的。

数组类型的成员是以下的所有:

  • 公共最终字段长度,它包含部件阵列的 的数量。 长度可能为正值或为零

来源:JLS §10.7

正如mprivat提到的,如果你曾经尝试创建大小为负的数组,一个NegativeArraySizeException将被抛出。

+0

那么为什么要检查它(<0)? – Reimeus 2012-07-17 20:09:16

+4

@Reimeus给予好人们一些讨论。 – 2012-07-17 20:10:01

+9

@Reimeus:因为程序员从不犯任何错误,并且始终写出最优化的代码。 – tskuzzy 2012-07-17 20:10:18

6

我不相信这是可能的。即使通过反思,它也被视为NegativeArraySizeException。

+0

我努力改变数组的长度,但发现自己无法这样做。 'getDeclaredFields()'方法返回一个数组输入的空结果,'Array'反射类可以理解地没有这样的方法(因为你为什么要这样做?)我认为没有直接修改内存就没有这样做的方式,但我怀疑实际上有一个检查会阻止这一点。当然,如果一个程序正在修改你的内存,那么你的问题会比参数检查更大...... – corsiKa 2012-07-18 14:35:02

+0

是的,我认为那只是错误的代码。唯一能做到的就是以某种方式修改字节码。坦率地说,即使如此,如果长度以某种方式编码为无符号数(我怀疑是这种情况),我并不是100%确定。 – mprivat 2012-07-18 15:11:01

+0

我不这么认为,因为你不能编译int [] a = new int [3000000000];' - 我怀疑它像其他任何存储为int一样。 – corsiKa 2012-07-18 16:04:08

0

这只是一个异常处理问题。你可以在Java中创建一个负数大小的数组 - 它在编译时甚至不会抛出异常。但在运行时,您的程序将无法运行,直到更正为止。 (它会抛出一个NegativeArraySizeException。)

问题是在运行时引发此异常而不是编译时 - 这就是为什么异常已被IllegalArgumentException处理。

+0

好,但需要一些更多的解释.. – Shivaay 2013-08-21 17:50:03

+0

“*您可以在Java *中创建一个负数大小的数组。” - 否,您不是。你可以写*新的int [-1],但JVM不会创建这样的数组。 Java数组对象永远不会有负数长度。 – dimo414 2016-11-24 07:09:11