我正在经历一个他们正在创建输出流的开源项目,并遇到了以下方法:
@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 :(得分:29)
不,这永远不会发生。根据Java规范,长度保证是非负的。
数组类型的成员是以下所有成员:
- 公共最终字段长度,包含组件数 数组。 长度可能为正或零。
来源:JLS §10.7
正如mprivat所提到的,如果您尝试创建负数大小的数组,则会抛出NegativeArraySizeException。
答案 1 :(得分:6)
我不相信这是可能的。即使通过反射,它也会被NegativeArraySizeException保护
答案 2 :(得分:0)
这只是一个异常处理问题。您可以在Java中创建一个负数大小的数组 - 它在编译时甚至不会抛出异常。但在运行时,您的程序将不会运行,直到更正。 (它将抛出NegativeArraySizeException
。)
问题是在运行时而不是编译时抛出此异常 - 这就是使用IllegalArgumentException
处理异常的原因。