Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找回文字符串引发StringIndexOutOfBoundsException,可能的原因?_Java_String - Fatal编程技术网

Java 查找回文字符串引发StringIndexOutOfBoundsException,可能的原因?

Java 查找回文字符串引发StringIndexOutOfBoundsException,可能的原因?,java,string,Java,String,如果提供一个字符串,我的目标是检查即使在重新排列字符后,是否可以将该字符串设置为回文字符串 例如:aaabbb可以通过更改为:bbaaabb使其成为回文 所以我试着比较字符串的所有排列和它的反面,如果它存在,打印一个YES。以下是迄今为止的代码: private static void permutation(String prefix, String str) { temp.setLength(0); //temp is a StringBuilder int n = str.

如果提供一个字符串,我的目标是检查即使在重新排列字符后,是否可以将该字符串设置为回文字符串

例如:aaabbb可以通过更改为:bbaaabb使其成为回文

所以我试着比较字符串的所有排列和它的反面,如果它存在,打印一个YES。以下是迄今为止的代码:

private static void permutation(String prefix, String str)
{
    temp.setLength(0); //temp is a StringBuilder
    int n = str.length();
    if((n==0) && (str.charAt(0)==str.charAt(n-1)))
    {
        temp.append(prefix);
        temp.reverse();
        if(prefix.equals(temp.toString()))
        {
            System.out.println("YES");
            System.exit(0);
        }
    }
    else
    {
        for(int i=0;i<n;i++)
            permutation(prefix+str.charAt(i),str.substring(0,i)+str.substring(i+1,n));
    }
}
现在的问题是,在运行时,我在这一行得到一个java.lang.StringIndexOutOfBoundsException:排列前缀+str.charAti,str.substring0,I+str.substringi+1,n


这可能是什么原因造成的

这一行也会给你一个例外:

if((n==0) && (str.charAt(0)==str.charAt(n-1)))

如果n==0,则字符串为空,charAt0将失败。不确定您在这里测试的是什么。

我不打算为您调试它,但我会建议您自己调试这类东西的过程

找出问题所在。所有关于回文的细节都无关紧要。在对字符串调用其中一个方法时,问题是java.lang.StringIndexOutOfBoundsException

仔细了解失败的地方。该行中有几个方法调用失败。如果不清楚哪个方法调用是问题所在,可以使用调试器单步执行,也可以将该行分成几行,例如通过创建中间变量来保存中间状态

用一个简化的例子再现这个问题。使用main方法创建一个新类,或者编写一个单元测试,并编写显示问题的代码。删除不是显示问题绝对必要的所有内容

修正你的例子。一旦您隔离了问题并阅读了文档,就很可能知道如何解决它。如果不是这样,并且你仍然被卡住了,那么就发布一个关于堆栈溢出的简单示例,并解释你的期望和得到的结果

修正你的代码。对原始代码应用相同的修复

字符串索引越界异常-此异常由String类的方法引发,以指示索引为负或大于字符串本身的大小

在上面的代码中,您递归地调用置换方法

假设我们第一次将字符串str=xy和前缀传递给置换方法

由于其长度大于0,它将到达else块。 在else块中,我们使用str的长度循环

这里的长度i.e n是2。 在第一个循环中,i=0。所以前缀+str.charAti将给出+x=x和str.substring0,i+str.substringi+1,n 将给出str.substring0,0+str.substring0+1,2=+y=y

现在我们再次将这些值传递给置换方法;i、 e.置换x,y。 所以当您在方法中传递这些值时,字符串str立即变成y,字符串前缀变成x 但您仍然在循环中,在第二个循环中,i=1和prefix+str.charAt1,即x+y.charAt1将抛出异常


这里您可以看到字符串str=y,长度为1,我们试图在位置1处获取char。这就是出现此异常的原因。

您自己采取了哪些步骤来调试问题?这是因为当i=n-1时,子字符串i+1,n将变为子字符串n,n。。。因为字符串的索引为0。。它将通过越界异常。您正在尝试访问一个不存在的索引…此外,您可以尝试-计算给定字符串中的字母数…对于偶数情况,每个字母的计数应为2,对于奇数情况,除给定字符串中的一个字母外,其他情况都是一样的。虽然我非常喜欢您的答案,但我无法对其进行投票,因为它不能直接回答这个问题,或者我的直觉是这样的。也许你可以从中提出一个自我回答的问题?