Programm hängt sich auf

Timo2010

Mitglied
Hallo,
ich habe ein komisches Problem. Das Programm hängt sich auf, sobald unterschiedliche Operatoren gedrückt werden.
Der ActionListener:
Java:
if (e.getSource()==TaschenrechnerUIJWindow.mal){
	mal = "*";
	if (TaschenrechnerUIJWindow.operandenstrings.toString() != ""){
		addOperand(TaschenrechnerUIJWindow.operandenstrings);
		sizeoperanden++;
		}
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+mal);
	if (TaschenrechnerUIJWindow.operatoren.isEmpty() || istHoeherwertig(mal,TaschenrechnerUIJWindow.operatoren.top())){
		TaschenrechnerUIJWindow.operatoren.push(mal);
}
	else {
		while (!TaschenrechnerUIJWindow.operatoren.isEmpty()||!istHoeherwertig(mal,TaschenrechnerUIJWindow.operatoren.top())){
			if (sizeoperanden >=2){
				rechne(mal);
				}
			if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
				TaschenrechnerUIJWindow.operatoren.push(mal);
				break;
			}
		}
		}
	}
	if (e.getSource()==TaschenrechnerUIJWindow.geteilt){
		geteilt = "/";
		if (TaschenrechnerUIJWindow.operandenstrings.toString() != ""){
			addOperand(TaschenrechnerUIJWindow.operandenstrings);
			sizeoperanden++;
			}
		TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+geteilt);
		if (TaschenrechnerUIJWindow.operatoren.isEmpty() || istHoeherwertig(geteilt,TaschenrechnerUIJWindow.operatoren.top())){
			TaschenrechnerUIJWindow.operatoren.push(geteilt);
	}
		else {
			while (!TaschenrechnerUIJWindow.operatoren.isEmpty()||!istHoeherwertig(geteilt,TaschenrechnerUIJWindow.operatoren.top())){
				if (sizeoperanden >=2){
					rechne(geteilt);
				}
				if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
				TaschenrechnerUIJWindow.operatoren.push(geteilt);
				break;
			}
			}
			}		
	}

Die rechne Methode:
Java:
public void rechne(String eingabeoperator){
		if (!TaschenrechnerUIJWindow.operatoren.isEmpty() && sizeoperanden>=2){
		double operandaint = Double.valueOf((String)TaschenrechnerUIJWindow.operanden.top());
		TaschenrechnerUIJWindow.operanden.pop();
		double operandbint = Double.valueOf((String)TaschenrechnerUIJWindow.operanden.top());
		TaschenrechnerUIJWindow.operanden.pop();
		String stackoperator = (String)TaschenrechnerUIJWindow.operatoren.top();
		TaschenrechnerUIJWindow.operatoren.pop();
		if (stackoperator == "*"){
			zwischenergebnis = operandbint * operandaint;
		}
		if (stackoperator == "/"){
			zwischenergebnis = operandbint / operandaint;
		}
		if (stackoperator == "+"){
			zwischenergebnis = operandaint + operandbint;
		}
		if (stackoperator == "-"){
			zwischenergebnis = operandaint - operandbint;
		}
		zwischenergebnisstring = String.valueOf(zwischenergebnis);
		TaschenrechnerUIJWindow.operanden.push(zwischenergebnisstring);
		sizeoperanden-=1;
		}
		System.out.println(zwischenergebnisstring);
	}

Das komische ist, dass es bei den gleichen Operatoren (z.B. 4*4*4) funktioniert, aber bei unterschiedliche (z.B. 4*4/4) ab dem zweiten Operatoren hängt.

Wie kann es dazu kommen, dass ein Programm nicht mehr reagiert? Liegt es an der Schleife?
 
Liegt das denn daran? Ich glaube eher nicht. In der Schule haben wir den Vergleich so gelernt. Denn die While Schleife scheint den Fehler zu verursachen.
 
Aber das ist doch nicht die Fehlerursache oder? Schließlich funktionierte es auch nur mit dem gleichen Operator.

Muss man also immer eine extra Variable erstellen?
 
Zunächst mal muss man Strings mit equals statt mit == vergleichen. Solange das nicht der Fall ist, lohnt es sich kaum, den Rest zu analysieren, weil die ersten elementaren Fallunterscheiden bereits nicht greifen.
 
So müsste es doch z.B. richtig verglichen sein:
Java:
		String operatormal = "*";
		String operatorgeteilt = "/";
		String operatorplus = "+";
		String operatorminus = "-";
		if ((operatora.equals(operatormal) || (operatora.equals(operatorgeteilt)) && (operatorb.equals(operatorplus))||(operatorb.equals(operatorminus)))){
 
Und da wundere ich mich, dass es alles nicht klappt. Vielen Dank für die wichtige Info. Eine Frage noch:
Wie sieht es aus, wenn man z.B. prüfen will, ob etwas != "" ist? Macht man es dann so:
!wert.equals("")?
 
Wenn ich mir sicher bin, dass stackoperator niemals null sein soll, dann verstecke ich durch die zweite Variante einen Fehler, wenn stackoperator (aus welchem Grund auch immer) doch irgendwann mal null sein sollte. In dem Fall möchte ich möglich früh eine Exception um die Ohren geworfen bekommen, und nicht, dass das Programm einfach so weiter läuft und am Ende unsinnige Ergebnisse liefert.
 

Zurück
Oben