Java 字符串索引越界异常错误

Java 字符串索引越界异常错误,java,string,Java,String,我真的不知道为什么会出现这个错误。该代码旨在测试回文,而不考虑标点符号 这是我的代码: char junk; String temp = ""; for (int i = 0; i < txt.length(); i++) { junk = txt.charAt(i); if (Character.isLetterOrDigit

我真的不知道为什么会出现这个错误。该代码旨在测试回文,而不考虑标点符号

这是我的代码:

            char junk;
            String temp = "";

            for (int i = 0; i < txt.length(); i++)
            {
                junk  = txt.charAt(i);
                if (Character.isLetterOrDigit(txt.charAt(jumk)))
                {
                    temp += junk;
                }
            }
            txt = temp;
            left = 0;
            right = txt.length() -1;

            while (txt.charAt(left) == txt.charAt(right) && right > left)
            {
                left++;
                right--;
            }
是你的问题,yP是一个字符而不是一个位置的引用

你的意思可能是:

 if (Character.isLetterOrDigit(yP))
编辑:我的评论:
右边的值是-1,charAt需要一个大于0的整数。。因此,您应该检查txt的长度,如果它==0,则显示一条消息,说明需要实际的单词

您应该在到达此行之前停止执行:

right = txt.length() -1;
这是您的固定代码:

do
    {
        System.out.println("Enter a word, phrase, or sentence (blank line to stop):");
        txt = kb.nextLine();
    }

while (!txt.equals(""));

    txt = txt.toLowerCase();
    char yP;
    String noP = "";

    for (int i = 0; i < txt.length(); i++)
    {
        yP  = txt.charAt(i);
        if (Character.isLetterOrDigit(txt.charAt(yP)))
        {
            noP += yP;
        }
    }
    txt = noP;

    left = 0;
    right = txt.length() -1;

    while (txt.charAt(left) == txt.charAt(right) && right > left)
    {
        left++;
        right--;
    }

    if (left > right)
    {
        System.out.println("Palindrome");
        cntr++;
    }
    else
    {
        System.out.println("Not a palindrome");
    }
do
{
System.out.println(“输入一个单词、短语或句子(空行停止):”;
txt=kb.nextLine();
}
而(!txt.equals(“”);
txt=txt.toLowerCase();
char-yP;
字符串noP=“”;
对于(int i=0;ileft)
{
左++;
对--;
}
如果(左>右)
{
System.out.println(“回文”);
cntr++;
}
其他的
{
System.out.println(“不是回文”);
}
是你的问题,yP是一个字符而不是一个位置的引用

你的意思可能是:

 if (Character.isLetterOrDigit(yP))
编辑:我的评论:
右边的值是-1,charAt需要一个大于0的整数。。因此,您应该检查txt的长度,如果它==0,则显示一条消息,说明需要实际的单词

您应该在到达此行之前停止执行:

right = txt.length() -1;
这是您的固定代码:

do
    {
        System.out.println("Enter a word, phrase, or sentence (blank line to stop):");
        txt = kb.nextLine();
    }

while (!txt.equals(""));

    txt = txt.toLowerCase();
    char yP;
    String noP = "";

    for (int i = 0; i < txt.length(); i++)
    {
        yP  = txt.charAt(i);
        if (Character.isLetterOrDigit(txt.charAt(yP)))
        {
            noP += yP;
        }
    }
    txt = noP;

    left = 0;
    right = txt.length() -1;

    while (txt.charAt(left) == txt.charAt(right) && right > left)
    {
        left++;
        right--;
    }

    if (left > right)
    {
        System.out.println("Palindrome");
        cntr++;
    }
    else
    {
        System.out.println("Not a palindrome");
    }
do
{
System.out.println(“输入一个单词、短语或句子(空行停止):”;
txt=kb.nextLine();
}
而(!txt.equals(“”);
txt=txt.toLowerCase();
char-yP;
字符串noP=“”;
对于(int i=0;ileft)
{
左++;
对--;
}
如果(左>右)
{
System.out.println(“回文”);
cntr++;
}
其他的
{
System.out.println(“不是回文”);
}

变量
yP
是您在索引
i
处的字符,而不是索引(因为您在给出错误的行中使用它)。将该行更改为:

if (Character.isLetterOrDigit(yP)) { ...
针对新问题进行编辑:

您不需要while循环来检查用户是否未输入任何内容,因为在这种情况下,您不希望重复执行某些操作(这就是循环的作用)。由于您只想执行一次操作,即打印出他们找到的回文数,因此可以使用
if
语句。结构如下所示:

do {
    get user input

    if they entered the empty string "" {

        print out how many palindromes they have found so far

    } else { // they must have entered text, so check for palindrome

        your normal palindrome checking code goes here

    }

} while (your condition);
编辑2:

试着改变

if (left > right)


因为如果left==right,这意味着它们都位于奇数长度字符串(例如kayak中的“y”)的中间字符上,这意味着该字符串是回文。

变量
yP
是您在索引
i
处的字符,而不是索引(因为您在给出错误的行上使用它)。将该行更改为:

if (Character.isLetterOrDigit(yP)) { ...
针对新问题进行编辑:

您不需要while循环来检查用户是否未输入任何内容,因为在这种情况下,您不希望重复执行某些操作(这就是循环的作用)。由于您只想执行一次操作,即打印出他们找到的回文数,因此可以使用
if
语句。结构如下所示:

do {
    get user input

    if they entered the empty string "" {

        print out how many palindromes they have found so far

    } else { // they must have entered text, so check for palindrome

        your normal palindrome checking code goes here

    }

} while (your condition);
编辑2:

试着改变

if (left > right)


因为如果left==right,这意味着它们都位于奇数长度字符串(例如kayak中的“y”)的中间字符上,这意味着该字符串是回文。

作为旁注:我会将第一个for替换为:txt.replaceAll(“\W”,”);你差一点就得到了。。。此行:Character.isleterOrdigit(txt.charAt(yP))正在字符串中查找位置,而不是字符。作为旁注:我将用:txt.replaceAll(“\W”,”)替换第一个for;你差一点就得到了。。。这一行:Character.isleterordigit(txt.charAt(yP))正在字符串中查找位置,而不是字符。不用担心,欢迎使用堆栈溢出!如果这些答案中的任何一个对您有帮助,您应该单击他们答案旁边的复选框,将其指示为已接受的答案。好的,实际上现在它可以用来说明它是否是回文,但当我只按enter键而不输入任何内容时,我可以在第38行显示另一个错误,即:while(txt.charAt(左)==….行与以前相同的错误。右键的值为-1,字符需要大于0的整数。因此,您应该检查txt的长度,如果它为==0,则显示一条消息,说明需要一个实际单词。是的,im在do while循环中的含义是什么?如果他们输入一个空行并输入t,我希望它以某种方式跳过它告诉他们有多少回文。我试着用do while循环来做,但因为它在循环中询问他们,while直到之后才起作用。查看我编辑的帖子,你会看到while循环的结束让你感到满足。不用担心,欢迎使用stack overflow!如果这些答案中的任何一个对你有帮助,你应该单击复选框beside他们的答案以表明它是被接受的答案。好的,实际上现在它可以用来表示它是否是回文,但当我只是点击回车键而没有输入任何内容时,我可以在第38行显示另一个错误,即:while(txt.charAt(左)==….行与以前相同的错误。右键的值为-1,字符需要大于0的整数。因此,您应该检查txt的长度,如果为==0,则显示一条消息,说明需要实际单词。是的,im的意思是什么