2014-09-22 2 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); 
    } 
} 

Я добавил пункт-1 в исходный код. Я искал метод getChars. Когда я запускаю его, эта программа дает мне ArrayIndexOutOfBoundsException. Вот что я читал в документах String.

общественных недействительный GetChars (интермедиат srcBegin, внутр srcEnd, символ [] ДСТ, внутр dstBegin)

Броски: IndexOutOfBoundsException - Если какое-либо из следующих условий: srcBegin отрицателен. srcBegin больше srcEnd srcEnd является больше, чем длина этой строки dstBegin отрицательно dstBegin + (srcEnd-srcBegin) больше, чем dst.length

Что такое destBegin? Какое смещение, о чем говорит документация. 1 - допустимое смещение в целевом массиве. Пожалуйста, помогите мне решить эту путаницу.

Спасибо.

+0

Можете ли вы добавить к своему вопросу строки источника и назначения? Это может помочь нам прояснить, почему это выходит за рамки. –

+0

не уверен, в чем вопрос ... 1 является допустимым смещением – Mzf

+0

Исходная строка @JasonD включена в программу. – benz

ответ

1

Как написано в documentation

символов копируются в подмассива ДСТ начиная с индекса dstBegin и заканчивая индексом:

dstbegin + (srcEnd-srcBegin) - 1 

так в вас дело

1 + (Len - 0) -1 = Len

отмечают, что это конец Индекс - так что ваш конечный индекс len, но в массиве последний индекс len -1

+0

Это означает, что длина адресата автоматически вычисляется во время выполнения, используя формулу dstbegin + (srcEnd-srcBegin) - 1, самой JVM. Это правда? – benz

+0

Почему это имеет значение, когда он рассчитал его? может быть, это все равно, и просто попробуйте написать – Mzf

1

Вы получаете IndexOutOfBoundsException, потому что у вас закончилась комната в целевом массиве tempCharArray, длина которого len. Чтобы скопировать массив, запустите getChars в целевом массиве в начале массива с индексом 0.

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

tempCHarArray такой же длины, как и у палиндрома. Вы пытаетесь скопировать массив палиндром, начиная с индекса 1. Попробуйте и перезапустите или начальный индекс при 0 ->

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