最近在看java.nio包的源代码,其中,Buffer类中有这么个方法:
static void checkBounds(int off, int len, int size) { // package-private
if ((off | len | (off + len) | (size - (off + len))) < 0)
throw new IndexOutOfBoundsException();
}
它用来检查数组是否越界,被子类如ByteBuffer的get、put方法调用:
public ByteBuffer get(byte[] dst, int offset, int length) {
checkBounds(offset, length, dst.length);
if (length > remaining())
throw new BufferUnderflowException();
int end = offset + length;
for (int i = offset; i < end; i++)
dst[i] = get();
return this;
}
我的疑问是:checkBounds方法中,那个判断语句表达的是什么意思(位运算本身我已经做了了解),是off、len、(off + len)这几个表达式都大于0的意思吗? 求解惑
------解决方案--------------------
意思是只要有一个小于0条件成立,进入判断,抛出异常
只有当几个条件都大于0的时候,才会条件不成立,不进入判断不抛出异常
------解决方案--------------------
整数范围是-2^31 ~ 2^31-1,你觉得比如两个2^31-1相加,结果还会是正数码?
int off = Integer.MAX_VALUE, len = Integer.MAX_VALUE;
System.out.println(off);
System.out.println(len);
System.out.println(off + len);
输出
2147483647
2147483647
-2