字符串索引Out of Bounds在ricorive方法中的异常

时间:2013-02-22 18:00:45

标签: java

程序返回一个字符串,获得两个字符串的交换字符;即 string s1 =“aceg”string s2 =“hfdb”结果为“abcdefgh”(两个字符串的长度始终相同;

好吧,我这样做了:

public class Eserc2 {

    public static String ricorsiveString(String s1, String s2) {

        if(s1.length() == 0 && s2.length() == 0) {
            return "";
        } else {

            char c = s1.charAt(0);
            char b = s2.charAt(s2.length()-1);

            String s = String.valueOf(c) ;
            String t = String.valueOf(b) ;
            String tot = s+t ;

            return tot + ricorsiveString(s1.substring(1),s2.substring(s2.length()));
        }
    }

    public static void main(String[] args) {

        String a = "aceg";
        String b = "bdfh";
        ricorsiveString(a,b);

    }
}

问题是当我编译pc时发现异常:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.charAt(String.java:658)
    at eserc2.Eserc2.ricorsiveString(Eserc2.java:20)
    at eserc2.Eserc2.ricorsiveString(Eserc2.java:26)
    at eserc2.Eserc2.main(Eserc2.java:34)

你能帮我吗???

4 个答案:

答案 0 :(得分:1)

 if(s1.length() == 0 && s2.length() == 0) {

应该是

 if(s1.length() == 0 || s2.length() == 0) {

答案 1 :(得分:1)

问题是如果s2为空而不是s1

if(s1.length() == 0 && s2.length() == 0)

将为false(s1不为空),但是这一行:

s1.length() == 0 && s2.length() == 0

将尝试访问-1位置的字符。

注意:如果您逐步调试了程序,那么您可以在比输入问题所花费的时间更短的时间内找到问题!

答案 2 :(得分:1)

这一行没有做你想要的(s2.substring(s2.length())调用总是给你一个长度为0的字符串

return tot + ricorsiveString(s1.substring(1),s2.substring(s2.length()))

应该替换为

return tot + ricorsiveString(s1.substring(1),s2.substring(0, s2.length() - 1));

作为设计选择,您还应该测试传递的字符串是否与您必须具有相同长度的前提条件相匹配。或者,更改&&测试到|| (正如其他人所建议的那样)将使代码适用于不同长度的字符串。

答案 3 :(得分:0)

您声明的条件不正确应该是:

if(s1.length() == 0 || s2.length() == 0) {

因为如果任何一个变量长度为零,则代码不应该执行。