Программа палиндром запущена, но выдает сообщение об ошибке

Предполагается, что эта программа определяет, является ли слово палиндромом (одно и то же слово вперед и назад). Мне трудно понять, почему мой компьютер запускает эту программу, но при этом появляется сообщение об ошибке. Может кто-нибудь объяснить?

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out
of range:

код

public class Palindrome {
    public static void main(String[] args)
    {
        System.out.println("Enter word here: ");
        String a = StdIn.readLine();

        for(int i = a.length() - 1 ; i >= 0; ++i)
        {
            if (a.charAt(i) != a.charAt(a.length() - i)) System.out.println("Not a Palindrome");
            else System.out.println("Palindrome");
        }

    }
}

person Ryan Hardin    schedule 01.08.2015    source источник


Ответы (5)


Переменная итерации цикла i увеличивается в неправильном направлении. Вы должны иметь

for(int i = 0; i < a.length(); ++i)

OR

for(int i = a.length() - 1 ; i >= 0; --i)

Вам также необходимо изменить

a.charAt(a.length() - i))

to

a.charAt((a.length() - 1) - i)

потому что charAt использует индекс, отсчитываемый от нуля, как и все другие методы манипулирования строками.

person user1886323    schedule 01.08.2015
comment
К вашему сведению - по моему опыту, первое предложение было бы лучше, потому что необычно иметь цикл for, в котором переменная уменьшается. - person user1886323; 01.08.2015
comment
это не правильно, кинет IndexOutOfBoundException сюда: a.charAt(a.length() - i)) - person ka4eli; 01.08.2015

Уменьшить переменную i вместо ее увеличения в цикле for?

person John    schedule 01.08.2015

Ваш цикл for должен уменьшать i, а не увеличивать его.

person schtever    schedule 01.08.2015

Вы увеличиваете счетчик i, но должны уменьшать его, потому что вы начинаете с i = a.length() - 1. Это также то, что исключение пытается вам сказать. Кроме того, вы сравниваете все символы строки дважды!

person Rens van der Heijden    schedule 01.08.2015

Ваша программа останавливается, когда возникает исключение. У вас есть несколько ошибок, поэтому я решил переписать ваш код. Вызовите этот метод из основного:

  static void isPalindrome(String s) {
        boolean res = true;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {
                res = false;
                break;
            }
        }
        System.out.println(res ? "Palindrome" : "Not s Palindrome");
    }
person ka4eli    schedule 01.08.2015
comment
Это очень помогло, единственное, что я добавил, это чтобы он мог распознавать, была ли буква заглавной. Спасибо за помощь! - person Ryan Hardin; 02.08.2015