2015-10-07 57 views
2

以下代碼拋出數組索引超出綁定異常。我初始化了1000個大小但尚未完全使用。未使用的指數的值究竟是什麼?數組索引超出綁定異常java

byte[] buffer=new byte[1000]; 
    String s="i am a stupid"; 
    buffer=s.getBytes(); 

    System.out.println(buffer[30]); 

回答

5

當調用String#getBytes方法你會得到一個新的數組,長度初始化等於表示字符串所需的字節數。由於Java docs

使用給定的字符集將此字符串編碼爲一個字節序列,將結果存儲到新的字節數組中。

在你的情況下,它的長度等於長度字符串(13個字節),這是不到30呢。這就是你得到這個異常的原因,同時試圖獲得第30個元素。

如果你需要與你從字符串成爲一個數組初始化緩衝區變量,你需要使用System#arraycopy方法:

byte[] byteAr = s.getBytes(); 
System.arraycopy(byteAr, 0, buffer, 0, byteAr.length); 

如果你想知道的,是用什麼值來初始化默認的數組,所以它是數組組成的數據類型的默認值。在字節的情況下,默認值爲0.

2

因爲buffer=s.getBytes();不使用剛剛分配的數組。它使buffer引用了一個全新的數組,在你的例子中它不會有30個成員。

1

當您重新分配引用時,您分配的buffer不再可訪問。我想你想使用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

byte[] buffer=new byte[1000]; 
String s="i am a stupid"; 
byte[] bytes=s.getBytes(); 
System.arraycopy(bytes, 0, buffer, 0, bytes.length); 

注意buffer[30]將默認的0值。

+0

這會調整我的緩衝區大小到字節數組中的字符串的大小? –

+1

@VishalS不,你的緩衝區大小將是1000,只是第一個元素將被初始化爲字符串 – Stanislav

+0

我正在檢查緩衝區的大小,以跳出代碼中的while循環(如果不是1000,我想中斷)。從這個意義上說,我可以檢查上面提到的字節和緩衝區的長度。 B'coz如果他們不平等,我想打出來。 –