Java数组长度小于0?

时间:2012-07-17 20:00:15

标签: java arrays

我正在经历一个他们正在创建输出流的开源项目,并遇到了以下方法:

@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吗?比如,是否可以通过反射完成,这就是他们要防范的内容?

3 个答案:

答案 0 :(得分:29)

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

  

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

     
      
  • 公共最终字段长度,包含组件数   数组。 长度可能为正或零
  •   

来源:JLS §10.7

正如mprivat所提到的,如果您尝试创建负数大小的数组,则会抛出NegativeArraySizeException

答案 1 :(得分:6)

我不相信这是可能的。即使通过反射,它也会被NegativeArraySizeException保护

答案 2 :(得分:0)

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

问题是在运行时而不是编译时抛出此异常 - 这就是使用IllegalArgumentException处理异常的原因。