27

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

@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?就像,它可以通过反思来完成,而这正是他们所防范的吗?

4

3 回答 3

34

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

数组类型的成员全部如下:

  • 公共最终字段长度,其中包含数组的组件数。长度可以是正数或零

资料来源:JLS §10.7

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

于 2012-07-17T20:03:56.847 回答
6

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

于 2012-07-17T20:02:46.893 回答
0

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

问题在于这个异常是在运行时而不是编译时抛出的——这就是为什么使用IllegalArgumentException.

于 2013-08-21T17:17:52.603 回答