字符串索引超出范围使用强制方法的例外
程序返回一个获得两个字符串交换字符的字符串;即 字符串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)
你可以帮我吗???
if(s1.length() == 0 && s2.length() == 0) {
应该
if(s1.length() == 0 || s2.length() == 0) {
根据您的示例,您的算法不会对字母进行排序。将简单地将两者结合在一起。 – 75inchpianist 2013-02-22 18:05:29
的问题是,如果s2
是空的,但不是s1
:
if(s1.length() == 0 && s2.length() == 0)
将是错误的(s1
不为空),但此行:
s1.length() == 0 && s2.length() == 0
会尝试访问位置-1处的字符。
注意:如果您一步一步地调试程序,您会发现问题的时间比您输入问题的时间少!
你所说的条件是不正确应该是:
if(s1.length() == 0 || s2.length() == 0) {
因为如果可变长度的任何一个零代码应该不会执行。
此行是不是做你想要的东西(的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));
被替换
作为设计选择,您还应该测试传递的字符串是否符合您的前提条件,即它们的长度必须相同。或者,将& &测试更改为||。 (正如其他人所建议的)将使代码在不同长度的字符串上工作。
感谢家伙它现在的作品:))) – 2013-02-22 18:27:09
20和26行在哪里? – assylias 2013-02-22 18:02:39
当你*运行*不编译。仅供将来参考 – 75inchpianist 2013-02-22 18:02:49