2013-02-22 30 views
0

程序返回一个获得两个字符串交换字符的字符串;即 字符串S1 = “交流励磁发电机” 字符串s2 = “HFDB” 的结果为 “ABCDEFGH”(两个字符串总是具有相同的长度;字符串索引超出范围使用强制方法的例外

好,我proceded以这种方式:

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); 

    } 
} 

的问题是,当我编译的电脑发现了异常:

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) 

你可以帮我吗???

+0

20和26行在哪里? – assylias 2013-02-22 18:02:39

+0

当你*运行*不编译。仅供将来参考 – 75inchpianist 2013-02-22 18:02:49

回答

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

应该

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

根据您的示例,您的算法不会对字母进行排序。将简单地将两者结合在一起。 – 75inchpianist 2013-02-22 18:05:29

1

的问题是,如果s2是空的,但不是s1

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

将是错误的(s1不为空),但此行:

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

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

注意:如果您一步一步地调试程序,您会发现问题的时间比您输入问题的时间少!

0

你所说的条件是不正确应该是:

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

因为如果可变长度的任何一个零代码应该不会执行。

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)); 
被替换

作为设计选择,您还应该测试传递的字符串是否符合您的前提条件,即它们的长度必须相同。或者,将& &测试更改为||。 (正如其他人所建议的)将使代码在不同长度的字符串上工作。

+0

感谢家伙它现在的作品:))) – 2013-02-22 18:27:09