StringIndexOutOfBoundsException

tanzverfuehrung

Bekanntes Mitglied
haLLO ihr lieben, ich versuche mir grad eine Klasse zusammen zu bauen, die mir die Ableitung einer Funktion ausgibt! Da es nicht nur einfache Funktionen sein sollen sondern auch größere, verkettete...
habe ich grad eine Methode geschrieben, die mir die funktion,in mehrere Teilfunktionen splittet.
Es ist noch nicht die ganze logik drin aber mein JUnit test müsste eigentlich aber schon gehen. Kriegt aber immer wieder eine StringIndexOutOfBoundsException

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1958)
at funktionen.Funktionssplitter.zerlegeFunktionen(Funktionssplitter.java:37)
at funktionen.TestFunktionssplitter.testTestName(TestFunktionssplitter.java:48)

ich sehe auch bei debugen wo das passiert, also das der endindex< index ,doch das soll nicht passieren und verstehe auch nicht wieso!HIer mein Test

Java:
@Test
public void testTestName()throws Exception{
	String function = "Math.sin(x)+Math.cos(x)";
	ableitung = new ErsteAbleitung(function);
	splitter = new Funktionssplitter(function, ableitung);
	String[] zerlegeFunktionen = splitter.zerlegeFunktionen(function);
	assertThat(zerlegeFunktionen[0], is("Math.cos(x)"));
	assertThat(zerlegeFunktionen[1], is("-Math.sin(x)"));
}


und meine Klasse
Java:
package funktionen;

public class Funktionssplitter {

	String function;
	ErsteAbleitung ableitung;

	public Funktionssplitter(	String function,
								ErsteAbleitung ableitung) {
		super();
		this.function = function;
		this.ableitung = ableitung;
	}

	final char JOCKER_OPEN = '(';
	final char JOCKER_CLOSE = ')';
	final char JOCKER_MATH = 'M';
	String teilFunktion;

	String[] ableitungen = new String[2];;
	String[] regulärenAusdrücke = new String[5];
	private String art;
	private String restFunktion;
	int count = 0;

	String[] zerlegeFunktionen(String function) {
		if(function != null){
		for (int i = 0; i < function.length(); i++) {
			// wenn es eine mathematische Funktion ist...
			if (function.charAt(i) == JOCKER_MATH) {
				// ermittelt was das für eine funktion ist(cos, sin,exp...)
				int index = i + 5;
				art = function.substring(index, index + 3);
				// wo endet die mathematische funktion?
				int endIndex = function.indexOf(JOCKER_CLOSE)+1;
				//die gefundene Funktion die abgeleitet werden soll
				teilFunktion = function.substring(i, endIndex );
				//die Ausdrücke zwischen den Funktionen, aber nur wenn noch danach eine Funktion vorhanden ist
				if(endIndex != function.length()){
				regulärenAusdrücke[count] = function.substring(endIndex, endIndex+1);
				//die Funktion mit der weiter gearbeitet werden muss
				restFunktion = function.substring(endIndex+1, function.length());
				}
				else restFunktion = null;
				// cosinus
				if (art.equals("cos")) {
					ableitungen[count] = ableitung.cosAbleitung(teilFunktion);
					count++;
					if(restFunktion == null)
						return ableitungen;
					else
						zerlegeFunktionen(restFunktion);
				}
				// sinus
				 if  (art.equals("sin")) {
					ableitungen[count] = ableitung.sinAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
					zerlegeFunktionen(restFunktion);
					else
						return ableitungen;
				}
				// exponential
				 if (art.equals("exp")) {
					ableitungen[count] = ableitung.expAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
					zerlegeFunktionen(restFunktion);
					else
						return ableitungen;
				}
				// logarithmus
				 if (art.equals("log")) {
					ableitungen[count] = ableitung.lnAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
					zerlegeFunktionen(restFunktion);
					else
						return ableitungen;
				}
				// potenzieren
				 if (art.equals("pow")) {
					ableitungen[count] = ableitung.potenzAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
						zerlegeFunktionen(restFunktion);
					else
						return ableitungen;
				}
				// //wurzel
				// if(art == "sqr"){
				// ableitungen[count] =
				// ableitung.cosAbleitung(function.substring(i, endIndex));
				// count ++;
				// }

			}
		}
		}

		return ableitungen;
	}
}
Also wenn ich es debugge, dann funktioniert das auch alles soweit, bis die restFunktion null ist, weil die ganze Funktion schon durch gegangen ist.
wenn mein compiler in zeile 49 ist und restFunktion ==null, dann geht er zum return ableitungen;
so damit müsste das ganze doch vorbei sein oder nicht????
er soll mir nun nur das String[] mit den Ableitungen zurück geben aber irgendwie springt er immer in zeile 59, wenn die restFunktion null ist! Und dann fängt wieder von vorne an?!?!?!?!?!
Und ich verstehe einfach nicht wieso !!!Kann mir jemand weiter helfen?
???:L
 
Zuletzt bearbeitet von einem Moderator:

freez

Top Contributor
Schau dir mal genau die Stelle an:
Java:
int endIndex = function.indexOf(JOCKER_CLOSE)+1;

Was macht er wenn er an das letzte ')' in deinem String kommt? Ich vermute dass da dann [c]substring[/c] sich beschwert weil du hinter das letzte ')' zeigst.
 
Zuletzt bearbeitet:

tanzverfuehrung

Bekanntes Mitglied
Schau dir mal genau die Stelle an:
Java:
int endIndex = function.indexOf(JOCKER_CLOSE)+1;

Was macht er wenn er an das letzte ')' in deinem String kommt? Ich vermute dass da dann [c]substring[/c] sich beschwert weil du hinter das ')' zeigst.

aber die substring-Methode(anfangsIndex, endIndex)....ist ja die beschreibung, das bis ausschließlich endindex.!Von daher wird er ja sonst nicht mitgewertet, aber ich brauche ja auch die Klammer!:bahnhof:
edit:

und wenn ich das +1 weg nehmen, dann kommt trotzdem eine Exception
Java:
int endIndex = function.indexOf(JOCKER_CLOSE);
java.lang.StringIndexOutOfBoundsException: String index out of range: -2
at java.lang.String.substring(String.java:1958)
at funktionen.Funktionssplitter.zerlegeFunktionen(Funktionssplitter.java:37)
at funktionen.TestFunktionssplitter.sinAndCos(TestFunktionssplitter.java:47)
 
Zuletzt bearbeitet:
S

SlaterB

Gast
mir unverständlich wie man sich mit solchen banalen Fehlern derart lange aufhält,
mit zu wenig Erfahrung oder Intelligenz kann das doch nicht mehr zu tun haben,

nur Faulheit/ Engstirnigkeit bleibt da übrig, falls mir diese sehr konstruktive, zielgerichtete Kritik erlaubt ist,
ich will es so und wenn es nicht läuft ist Java schuld..

poste einfach vor dem subString-Aufruf
> System.out.println("i: " + i + ", " + endIndex);
ein wirklich extrem einfacher Befehl, oder?

die Ausgabe
Code:
i: 0, 11
i: 0, 11
i: 12, 11
zeigt in Sekunden, dass der endIndex immer die erste Klammer ist, obwohl du schon beim zweiten Term bist,
du musst also deinen Code ändern, so dass du die zweite/ die aktuell richtige Klammer findest,
bzw. so dass der erste Term vorher abgeschnitten wird,
du hast ja auch 'restFunktion' auf der man suchen könnte.., dann aber auch die Schleife und anderes anzupassen
(Zitat Kommentar "die Funktion mit der weiter gearbeitet werden muss")

die Korrektur mag nicht leicht sein, das muss man nicht in einem Zwinkern schaffen,
aber nur an der Exception hängen zu bleiben ist bedenklich,
ich rate dir nachzudenken und dein Fehlersuchverhalten zu verbessern
 
Zuletzt bearbeitet von einem Moderator:

tanzverfuehrung

Bekanntes Mitglied
mir unverständlich wie man sich mit solchen banalen Fehlern derart lange aufhält,
mit zu wenig Erfahrung oder Intelligenz kann das doch nicht mehr zu tun haben,

nur Faulheit/ Engstirnigkeit bleibt da übrig, falls mir diese sehr konstruktive, zielgerichtete Kritik erlaubt ist,
ich will es so und wenn es nicht läuft ist Java schuld..

poste einfach vor dem subString-Aufruf
> System.out.println("i: " + i + ", " + endIndex);
ein wirklich extrem einfacher Befehl, oder?

die Ausgabe
Code:
i: 0, 11
i: 0, 11
i: 12, 11
zeigt in Sekunden, dass der endIndex immer die erste Klammer ist, obwohl du schon beim zweiten Term bist,
du musst also deinen Code ändern, so dass du die zweite/ die aktuell richtige Klammer findest,
bzw. so dass der erste Term vorher abgeschnitten wird,
du hast ja auch 'restFunktion' auf der man suchen könnte.., dann aber auch die Schleife und anderes anzupassen
(Zitat Kommentar "die Funktion mit der weiter gearbeitet werden muss")

die Korrektur mag nicht leicht sein, das muss man nicht in einem Zwinkern schaffen,
aber nur an der Exception hängen zu bleiben ist bedenklich,
ich rate dir nachzudenken und dein Fehlersuchverhalten zu verbessern

NEIn !
also ganz ehrlich finde ich diese aussage einfach nur .....!anscheind hast du dir ja nicht mal meine frage durch gelesen odeR? oder mein code nicht richtig angeguckt!ich weiß es nicht...aufjedenfall hatte ich geschrieben, das ich weiß das der endindex zu klein ist beim letzten durchgang, aber der durchgang ist eh zu viel!!der soll garnciht passieren das war mein problem!!!!
und den ersten term habe ich abgeschnitten...deswegen ja die restFunktion und teilFunktion!und mit der restFunktion wird ja dann rekussiv wieder diese methode aufgerufen!:pueh:
naja wie auch immer, ich habe es hinbekommen, musste nur mit break; arbeiten
Java:
String[] zerlegeFunktionen(String function) {
		if(function != null){
		for (int i = 0; i < function.length(); i++) {
			// wenn es eine mathematische Funktion ist...
			if (function.charAt(i) == JOCKER_MATH) {
				// ermittelt was das für eine funktion ist(cos, sin,exp...)
				int index = i + 5;
				art = function.substring(index, index + 3);
				// wo endet die mathematische funktion?
				int endIndex = function.indexOf(JOCKER_CLOSE)+1;
				//die gefundene Funktion die abgeleitet werden soll
				teilFunktion = function.substring(i, endIndex );
				//die Ausdrücke zwischen den Funktionen, aber nur wenn noch danach eine Funktion vorhanden ist
				if(endIndex != function.length()){
				regulärenAusdrücke[count] = function.substring(endIndex, endIndex+1);
				//die Funktion mit der weiter gearbeitet werden muss
				restFunktion = function.substring(endIndex+1, function.length());
				}
				else restFunktion = null;
				// cosinus
				if (art.equals("cos")) {
					ableitungen[count] = ableitung.cosAbleitung(teilFunktion);
					count++;
					if(restFunktion != null){
						zerlegeFunktionen(restFunktion);
						break;}
						else
							break;
				}
				// sinus
				 if  (art.equals("sin")) {
					ableitungen[count] = ableitung.sinAbleitung(teilFunktion);
					count++;
					if(restFunktion != null){
						zerlegeFunktionen(restFunktion);
						break;
					}
					
					else
						break;
				}
				// exponential
				 if (art.equals("exp")) {
					ableitungen[count] = ableitung.expAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
					zerlegeFunktionen(restFunktion);
					else
						break;
				}
				// logarithmus
				 if (art.equals("log")) {
					ableitungen[count] = ableitung.lnAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
					zerlegeFunktionen(restFunktion);
					else
						break;
				}
				// potenzieren
				 if (art.equals("pow")) {
					ableitungen[count] = ableitung.potenzAbleitung(teilFunktion);
					count++;
					if(restFunktion != null)
						zerlegeFunktionen(restFunktion);
					else
						break;
				}
				// //wurzel
				// if(art == "sqr"){
				// ableitungen[count] =
				// ableitung.cosAbleitung(function.substring(i, endIndex));
				// count ++;
				// }

			}
		}
		}

		return ableitungen;
	}
}


aber warum du mich immer so doof anmachst, verstehe ich nicht!:bahnhof:
 
S

SlaterB

Gast
gut, da habe ich nicht genau genug gelesen, mich zu sehr auf deinen Thementitel verlassen,
was ich wiederum etwas zurück schicken kann,
wenn du schon weißt, dass es an Wiederholung liegt usw. warum dann dieser Thementitel, die Konzentration auf die Exception?
wenn eine Schleife falsch zu lange läuft ist ja verständlich dass es irgendwann gegen einen Baum geht

ich rede nur ernst mit dir wenn du ernste unnötige Fehler machst,
wenn ich eine Woche kein Posting sehe bin ich die Zufriedenheit in Person, von selber würde ich nicht dazu kommen ;)
ich werde es aber noch weiter zu vermeiden versuchen
 

Ähnliche Java Themen


Oben