Ошибка выхода за пределы индекса строки - PullRequest
2 голосов
/ 22 октября 2011

Следующий код пытается Для данной строки рекурсивно вычислить (без циклов) количество строчных символов 'x' в строке.

Код имеет эту ошибку: Исключение в потоке "main"java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 0

Основной метод для этого кода:

public static void main(String [] args)
{
  System.out.println(countX("hx1x"));
}

Фактический код:

public static int countX(String str)
{ 
    if(str.charAt(0) != 'x')
    {
        if(str.indexOf('x') >= 1)
        {
            return countX(str.substring(1, str.length()));
        }
        else
        {
            return 0;
        }
    }
    else
    {
        return 1 + countX(str.substring(1, str.length()));
    }
}

Ответы [ 4 ]

1 голос
/ 22 октября 2011

Просто добавьте

    if (str.length() <= 0) return 0;

в начале countX (...)

Исключение выдается при

    if(str.charAt(0) != 'x')

, когда str равно ""

Кстати.код не совсем эффективен при создании новых строк для каждой проверки символов.Также рекурсивные функции, такие как эта, генерируют StackOverflowError с достаточно длинным вводом.

Посмотрите на это: Java: Как подсчитать количество появлений символа в строке?

0 голосов
/ 23 октября 2011

Зачем делать это так сложно, когда ты можешь сделать что-то простое?Вот гораздо более простое решение вашей проблемы:

    int count=0;
    for(int i = 0; i< str.length(); i++){
        if(str.charAt(i) == 'x') count++;
    }
0 голосов
/ 23 октября 2011

Напишите набор модульных тестов для вашей функции. На данный момент это может быть так просто, как некоторые строки, такие как

assertEquals(2, countX("hx1x", 0));

на ваш основной (). Начните с действительно простых случаев, таких как:

assertEquals(0, countX("", 0));
assertEquals(0, countX("a", 0));
assertEquals(1, countX("x", 0));

Их будет еще проще отладить - используйте отладчик, если необходимо, но если ваш пример прост, как этот, он, вероятно, даже не понадобится.

0 голосов
/ 22 октября 2011

Вам не хватает базового случая рекурсии - что произойдет, если строка имеет нулевую длину?Попробуйте это:

public static int countX(String str) {
    if (str.length() == 0)
        return 0;
    else if (str.charAt(0) == 'x')
        return 1 + countX(str.substring(1));
    else
        return countX(str.substring(1));
}

В качестве альтернативы, вы можете опустить операцию подстроки и передать индекс, в котором вы находитесь в данный момент, - это более эффективно, так как позволяет избежать создания ненужных строковых объектов

public static int countX(String str, int idx) {
    if (idx == str.length())
        return 0;
    else if (str.charAt(idx) == 'x')
        return 1 + countX(str, idx+1);
    else
        return countX(str, idx+1);
}

Затем вы бы вызвали метод следующим образом:

countX("hx1x", 0)
...