/ /文字列インデックスの範囲外の例外的なメソッドでの例外 - java

ricorsiveメソッドの境界外の文字列インデックス - java

プログラムは2つの文字列の交換文字を取得した文字列を返します。すなわち string s1 = "aceg" string s2 = "hfdb"結果は "abcdefgh"です(2つのストリングの長さは常に同じです。

まあ、私はこのようにして進めました:

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)

あなたは私を助けてもらえますか?

回答:

回答№1は1
 if(s1.length() == 0 && s2.length() == 0) {

すべきである

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

回答№2の場合は1

問題は s2 空ですがそうではありません s1

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

falseになります(s1 空ではありません)、しかしこの行:

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

-1の位置にある文字にアクセスしようとします。

注:プログラムを段階的にデバッグしていれば、質問を入力するのにかかる時間よりも短時間で問題が見つかるはずです。


回答№3の場合は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));

設計上の選択として、次のことをテストする必要があります。渡された文字列は、長さが同じでなければならないという前提条件に一致します。あるいは、&&テストを||に変更します。 (他の人が示唆しているように)コードは異なる長さの文字列で動作するようになります。


回答№4の場合は0

あなたが述べた条件は正しくありません:

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

可変長のいずれか1つがゼロの場合、コードは実行されません。