/ / String Index Извън границите Изключение в рикорсивен метод - java

Струнен индекс Извън границите Изключение в рикорсивен метод - java

Програмата връща низ, получен чрез обмен на символи от два низа; т.е. string s1 = "aceg" низ 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)

Можете ли да ми помогне моля ???

Отговори:

1 за отговор № 1
 if(s1.length() == 0 && s2.length() == 0) {

би трябвало

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

1 за отговор № 2

Проблемът е дали s2 е празно, но не s1:

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

ще бъде невярно (s1 не е празен), но този ред:

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

ще се опита да осъществи достъп до символ на позиция -1.

Забележка: ако сте дебъгвали програмата си стъпка по стъпка, бихте намерили проблема за по-малко време, отколкото ви трябваше да въведете въпроса си!


1 за отговор № 3

Този ред не прави това, което искате (повикването 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 за отговор № 4

Условието, което сте посочили, е неправилно:

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

защото ако някоя от променливата дължина е нула, кодът не трябва да се изпълнява.