2012-12-17 72 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異常

但它是如何真正做的是實施具體。

相關問題