2014-09-22 87 views
2

我正在從K & B讀取有關字符串。對於一些額外的知識,我正在閱讀Oracle的教程。我正在從Oracle複製源代碼。String getChars()方法混淆

public class StringDemo { 
    public static void main(String[] args) { 
     String palindrome = "Dot saw I was Tod"; 
     int len = palindrome.length(); 
     char[] tempCharArray = new char[len]; 
     char[] charArray = new char[len]; 

     // put original string in an 
     // array of chars 
     for (int i = 0; i < len; i++) { 
      tempCharArray[i] = 
       palindrome.charAt(i); 
     } 

     // reverse array of chars 
     for (int j = 0; j < len; j++) { 
      charArray[j] = 
       tempCharArray[len - 1 - j]; 
     } 

     String reversePalindrome = 
      new String(charArray); 
     System.out.println(reversePalindrome); 

     //Testing getChars method //1 
     palindrome.getChars(0, len, tempCharArray, 1); 
     String tempString = new String(tempCharArray); 
     System.out.println(tempString); 
    } 
} 

我在源代碼中添加了point-1。我不明白getChars方法。當我運行它時,這個程序給我ArrayIndexOutOfBoundsException。這是我在String文檔中閱讀的內容。

公共無效則GetChars(INT srcBegin處,INT srcEnd,炭[] DST,整數 dstBegin)

拋出:IndexOutOfBoundsException - 如果任何下列條件爲真: srcBegin處是負的。 srcBegin處大於srcEnd srcEnd是 大於該字符串dstBegin的長度負 dstBegin +(srcEnd-sr​​cBegin處)比dst.length

什麼是destBegin更大?文檔談論的是什麼抵消。 1是目標數組中的有效偏移量。請幫我解決這個困惑。

謝謝。

+0

你可以添加到你的問題的源和目標字符串?這可能有助於我們澄清它爲什麼會走出界限。 – 2014-09-22 17:31:26

+0

不知道是什麼問題... 1是一個有效的偏移量 – Mzf 2014-09-22 17:31:39

+0

@JasonD源字符串包含在程序中。 – benz 2014-09-22 17:34:44

回答

1

正如寫在documentation

字符複製到的子陣DST開始於索引 dstBegin,並在指數結束:

dstbegin + (srcEnd-srcBegin) - 1 

所以你的情況是

1 +(LEN - 0)-1 = LEN

注意這是在端指數 - 所以你的結束索引是len但陣列中的最後一個索引是len -1

+0

這意味着,在運行時使用公式dstbegin +(srcEnd-sr​​cBegin) - 1自動計算JVM本身的目標長度。真的嗎? – benz 2014-09-22 17:36:25

+0

爲什麼他計算時很重要?也許它不在乎,只是簡單地寫作 – Mzf 2014-09-22 17:39:04

1

您得到一個IndexOutOfBoundsException,因爲您已經用盡了目標數組tempCharArray中的空間,其長度爲len。要複製陣列,請在位於索引0的數組開頭的目標陣列中啓動。

palindrome.getChars(0, len, tempCharArray, 0); 
0

tempCHarArray是相同的長度的迴文結構的。您正在嘗試迴文陣列複製從索引1試試這個,然後重新運行或從0開始的索引 - >

char[] tempCharArray = new char[len + 1];