Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java数组长度是否小于0?_Java_Arrays - Fatal编程技术网

Java数组长度是否小于0?

Java数组长度是否小于0?,java,arrays,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

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

@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));
    }
}
@重写公共无效写入(字节[]缓冲区,整数偏移量,整数长度){
if(buffer==null){
抛出新的NullPointerException(“缓冲区为null”);
}
如果(buffer.length<0){//请注意此处
抛出新的IllegalArgumentException(“缓冲区长度<0”);
}
如果(偏移量<0){
抛出新的IndexOutOfBoundsException(String.format(“偏移量%d<0”,偏移量));
}
如果(长度<0){
抛出新的IndexOutOfBoundsException(String.format(“长度%d<0”,长度));
}
如果(偏移>buffer.length | | length>buffer.length-偏移){
抛出新的IndexOutOfBoundsException(String.format(“偏移量%d+长度%d>缓冲区”“长度%d”,偏移量,长度,缓冲区.length));
}
}

因此,
byte[]buffer
只是一个普通的老
byte[]
。我们知道它不是空的。甚至可以使其长度小于0吗?比如,这可以通过反射来实现吗?这就是他们所要防范的吗?我不相信这是可能的。即使通过反射,它也会受到NegativeArraySizeException的保护。不,这永远不会发生。根据Java规范,长度保证为非负

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

  • 公共最终字段长度,包含组件的数量 数组的一部分长度可以是正或零
资料来源:


正如mprivat提到的,如果您试图创建一个负大小的数组,将抛出一个。这只是一个异常处理问题。在Java中,您可以创建一个大小为负的数组——在编译它时,它甚至不会抛出异常。但在运行时,在更正此错误之前,程序不会运行。(它将抛出一个
NegativeArraySizeException


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

@EdwardThomson处理异常的原因:我认为因为第一条语句检查
buffer==null
@thalador,所以不可能有这样的约定。物理上不能使
array.length<0
@thalador,很多情况下int可以是-1。当数组的长度可以是-1(这是这里要检查的)时,没有任何情况发生。这种方法的奇怪之处在于它什么也不写。作者是否被这些断言所占据而无法写出有用的东西?@a_horse_和_no_name我也见过很多这样的断言,我自己也写过一些,但总是在语言没有问题的情况下,var<0。手头的检查顺序是检查一个无符号值是否<0——假设您检查一个
char
是否<0。@Reimeus:因为程序员从不犯任何错误,总是编写最优化的代码。我曾努力以反射方式更改数组的长度,但发现自己无法做到这一点。
getDeclaredFields()
方法为数组输入返回一个空结果,
array
反射类没有这样的方法是可以理解的(因为你为什么想要它?)我认为如果没有直接修改内存,就没有办法做到这一点,但我怀疑是否有一个检查可以阻止这一点。当然,如果一个程序正在修改你的内存,你会遇到比参数检查更大的问题……是的,我认为这只是一个糟糕的代码。唯一能做到这一点的方法就是以某种方式修改字节码。坦白地说,即使这样,我也不能100%确定长度是否被编码为无符号数(我怀疑是这样的)-我怀疑它像其他任何东西一样被存储为
int
。你说得没错。因为
int[]a=新的int[-1]不编译。当然,它并没有按预期运行,但可以编译。另外,JVM中没有无符号int。嗯。好问题,“您可以在Java中创建一个大小为负数的数组”-不,您不能。您可以编写
newint[-1]
,但JVM不会创建这样的数组。任何Java数组对象都不会有负长度。