2012-12-17 109 views
-1

Java使用什么机制来有效地检查我试图访问的数组元素是否越界。我认为它可以做到的一种方式是将数组放在内存之前。但是,每次支票的if语句在时间上都是非常低效的。那它究竟是怎么做到的呢?Java如何高效地检查ArrayIndexOutOfBounds?

+0

什么让你觉得它检查什么?访问超出界限的索引会导致异常。 –

+0

它是否真的检查ArrayIndexOutOfBounds异常?如果是这样,为什么会得到异常? – manas

+2

@JesseWebb问题是Java如何识别有试图访问不属于数组的索引,因此它可以抛出AIOOB异常。 – SJuan76

回答

2

这是非常有名的一段代码,因为Oracle vs Google battle:

private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) { 
    if (fromIndex > toIndex) 

     throw new IllegalArgumentException("fromIndex(" + fromIndex + 
        ") > toIndex(" + toIndex+")"); 

    if (fromIndex < 0) 
     throw new ArrayIndexOutOfBoundsException(fromIndex); 

    if (toIndex > arrayLen) 
     throw new ArrayIndexOutOfBoundsException(toIndex); 

} 

这种方法在内部调用。如下

+0

@尼古拉,请你让我们知道甲骨文与谷歌之间的战斗是怎么做的,我很好奇。 – Abubakkar

+1

@Abu,我只更新了一个随机链接。你可以通过谷歌搜索找到更多。 –

0

简单的检查会做,

int[] a = new int[2]; 

if (a.size >= index) 
System.out.println("Item " + a[i]); 
+1

问题不在于何时启动了异常,而是JVM如何识别出尝试了非法访问(因此它可能会抛出异常)。 – SJuan76

0

看来,它的字面检查每个*aload*astore等指令边界在JVM 7说明书中说明。

如果指数不引用由数组引用 数组的边界内,则(* ASTORE,* aload等)指令抛出 ArrayIndexOutOfBoundsException异常

但它是如何真正做的是实施具体。

相关问题