str.substring(i,i+3);
a pomyśl dlaczego substring wyrzuci Ci błąd jak będzie na przedostatnim elemencie, a ma zwrócić następne i+3 :)
dalej błąd kompilacji, jeśli twoje i jest zbyt długie a jest... to widać wprost - i to substring zwraca błąd zanim błąd zwrócić może też charAt
str.charAt(i-1)
Generalnie jakbyś kod pisał samemu, to byś wiedział dlaczego jest źle... bo odpowiedź masz we wskazanym błędzie ...ten kod jest nie należy do Ciebie : http://www.javaproblems.com/2013/11/java-string-2-xyzthere-codingbat.html
Ty się nie musisz przejmować jakie ciągi się tu znajdują do wystapienia pierwszej kropki :) ... pomyśl, jeśli dopiero pojawi się kropka trzeba przeanalizować ciąg czy coś znajduje się przed i czy po kropce następne trzy znaki to "Xyz" nic więcej :)
Akurat jeszcze wartości "UJEMNE" dla twojego błędu wskazują na to, że początkowy indeks jest zbyt blisko końca i następne elementy nie mogą być wycięte bo nie istnieją
dla xyz np
System.out.println(str.substring(0,4)); // zwróci ci index 1 błędnie
System.out.println(str.substring(2,1)); // zwroci ci -1
// dlaczego -1? bo dla xyz, pozycja 2 to "z"
// i po z nie występuje nic a chcesz pobrać