2

在 jdk 中,有很多地方可以检查与 array.eg 相邻的参数。

/*..........
 *
 * @throws IllegalArgumentException
 *         If <tt>offset</tt> is negative or greater than
 *         <tt>buf.length</tt>, or if <tt>length</tt> is negative, or if
 *         the sum of these two values is negative.
 *
 * @param buf   Input buffer (not copied)
 * @param offset    Offset of the first char to read
 * @param length    Number of chars to read
 */
public CharArrayReader(char buf[], int offset, int length) {
    if ((offset < 0) || (offset > buf.length) || (length < 0) ||
            //$ offset+length
        (**(offset + length) < 0)**) {
        throw new IllegalArgumentException();
    }
    this.buf = buf;
    this.pos = offset;
    this.count = Math.min(offset + length, buf.length);
    this.markedPos = offset;
}

为什么“(偏移量+长度)<0”是必要的?

4

2 回答 2

2

在 Javaint中是有符号int的,因此当两个正数相加时可能会产生负值。它被称为环绕或整数溢出

于 2012-12-04T01:07:14.770 回答
1

我相信它正在检查溢出。

int 的范围是 -2,147,483,648 到 2,147,483,647。

从代码中可以看到,有些地方我们需要偏移+长度。如果 offset + length 大于 2,147,483,647 就会出现问题,并且 (offset + length) < 0) 正在检查这种情况。

于 2012-12-04T01:09:23.843 回答