java.lang.ClassCastException

Timo2010

Mitglied
Guten Tag,
ich brauche etwas Hilfe bei meinem Code. Ich erhalte folgenden Fehler, sobald ich folgende Buttonkombination habe: Operand, Operator, Operand, Operator, Operand, Operator
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
	at TaschenrechnerModel.rechne(TaschenrechnerModel.java:36)
	at TaschenrechnerModel.useoperator(TaschenrechnerModel.java:70)
	at TaschenrechnerModel.actionPerformed(TaschenrechnerModel.java:128)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Mein Quellcode lautet wie folgt:
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import zentralabi.linear.Stack;

public class TaschenrechnerModel implements ActionListener{
	private String operatorstand;
	private int sizeoperanden = 0;
	private int zwischenergebnis;
	private String usedoperator;

	
	public static void main(String[] args) {
		TaschenrechnerModel objekt = new TaschenrechnerModel();
	}
	public TaschenrechnerModel(){
	}
	public void checkoperator(String operatora, Object operatorb){
		if ((operatora == "*" || operatora == "/") && (operatorb == "*" || operatorb == "/")){
			operatorstand = "Gleichwertig";	
		}
		else if ((operatora == "-" || operatora == "+") && (operatorb == "*" || operatorb == "/")){
			operatorstand = "Niedriger";
		}
		else if ((operatora == "*" || operatora == "/") && (operatorb == "+" || operatorb == "-")){
			operatorstand = "Hoeher";
		}
		else if ((operatora == "-" || operatora == "+") && (operatorb == "-" || operatorb == "+")){
			operatorstand = "Gleichwertig";
		}
	}
	public void rechne(){
		int operandaint = Integer.valueOf((String)TaschenrechnerUIJWindow.operanden.top());
		TaschenrechnerUIJWindow.operanden.pop();
		int operandbint = Integer.valueOf((String)TaschenrechnerUIJWindow.operanden.top());
		TaschenrechnerUIJWindow.operanden.pop();
		String operator = (String)TaschenrechnerUIJWindow.operatoren.top();
		TaschenrechnerUIJWindow.operatoren.top();
		if (operator == "*"){
			zwischenergebnis = operandaint * operandbint;
		}
		else if (operator == "/"){
			zwischenergebnis = operandaint / operandbint;
		}
		else if (operator == "+"){
			zwischenergebnis = operandaint + operandbint;
		}
		else if (operator == "-"){
			zwischenergebnis = operandaint - operandbint;
		}
	}
	
	public void useoperator(String operator){
		TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+operator);
		TaschenrechnerUIJWindow.operanden.push(TaschenrechnerUIJWindow.operandenstrings.toString());
		sizeoperanden++; // Funktioniert noch nicht!!!
		TaschenrechnerUIJWindow.operandenstrings.setLength(0);
		if (TaschenrechnerUIJWindow.operatoren.isEmpty()){
			TaschenrechnerUIJWindow.operatoren.push(operator);
		}
		else {
			checkoperator(operator,TaschenrechnerUIJWindow.operatoren.top());
			System.out.println(""+operatorstand);
			if(operatorstand == "Hoeherwertig"){
				TaschenrechnerUIJWindow.operatoren.push(operator);
			}
			else if (operatorstand == "Gleichwertig"){
					if (sizeoperanden >=2){
						rechne();
						TaschenrechnerUIJWindow.operanden.push(zwischenergebnis);
					}
					}
		}
		
	}
	
	public void actionPerformed(ActionEvent e) {
		/*
		 * Operanden werden auf den Operandenstapel gelegt
		 */
if (e.getSource()==TaschenrechnerUIJWindow.nine){
	TaschenrechnerUIJWindow.operandenstrings.append(9);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+9);
}
else if (e.getSource()==TaschenrechnerUIJWindow.eight){
	TaschenrechnerUIJWindow.operandenstrings.append(8);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+8);
}
else if (e.getSource()==TaschenrechnerUIJWindow.seven){
	TaschenrechnerUIJWindow.operandenstrings.append(7);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+7);
}
else if (e.getSource()==TaschenrechnerUIJWindow.six){
	TaschenrechnerUIJWindow.operandenstrings.append(6);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+6);
}
else if (e.getSource()==TaschenrechnerUIJWindow.five){
	TaschenrechnerUIJWindow.operandenstrings.append(5);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+5);
}
else if (e.getSource()==TaschenrechnerUIJWindow.four){
	TaschenrechnerUIJWindow.operandenstrings.append(4);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+4);
}
else if (e.getSource()==TaschenrechnerUIJWindow.three){
	TaschenrechnerUIJWindow.operandenstrings.append(3);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+3);
}
else if (e.getSource()==TaschenrechnerUIJWindow.two){
	TaschenrechnerUIJWindow.operandenstrings.append(2);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+2);
}
else if (e.getSource()==TaschenrechnerUIJWindow.one){
	TaschenrechnerUIJWindow.operandenstrings.append(1);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+1);
}
else if (e.getSource()==TaschenrechnerUIJWindow.zero){
	TaschenrechnerUIJWindow.operandenstrings.append(0);
	TaschenrechnerUIJWindow.anzeige.setText(TaschenrechnerUIJWindow.anzeige.getText()+0);
	}
/*
 * Operatoren werden überprüft und je nach "Gewichtung" auf den Operatorenstapel gelegt
 */

if (e.getSource()==TaschenrechnerUIJWindow.mal){
	usedoperator = "*";
	useoperator(usedoperator);
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.geteilt){
		usedoperator = "/";
		useoperator(usedoperator);
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.plus){
		usedoperator = "+";
		useoperator(usedoperator);
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.minus){
		usedoperator = "-";
		useoperator(usedoperator);
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.comma){
		usedoperator = "*";
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.plusminus){
		usedoperator = "*";
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.MC){
		if (TaschenrechnerUIJWindow.operatoren.isEmpty()){

		}
		else {
			checkoperator("*",TaschenrechnerUIJWindow.operatoren.top());
		}
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.Mplus){
		if (TaschenrechnerUIJWindow.operatoren.isEmpty()){

		}
		
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.Mminus){
		if (TaschenrechnerUIJWindow.operatoren.isEmpty()){

		}
		}
	else if (e.getSource()==TaschenrechnerUIJWindow.MR){
		if (TaschenrechnerUIJWindow.operatoren.isEmpty()){

		}
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.C){
		if (TaschenrechnerUIJWindow.operatoren.isEmpty()){

		}
	}
	else if (e.getSource()==TaschenrechnerUIJWindow.giveresult){
		System.out.println(TaschenrechnerUIJWindow.operanden.top());
		System.out.println(TaschenrechnerUIJWindow.operatoren.top());
	}
}
}

Ich hoffe, ihr wisst, wo der Fehler beim casten des Strings liegt. Ich finde ihn leider nicht. Ich vermute, dass es an der Methode rechne() liegt.

Danke schon einmal für eure Hilfe.
 
Zuletzt bearbeitet von einem Moderator:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at TaschenrechnerModel.rechne(TaschenrechnerModel.java:36)
Ich finde ihn leider nicht. Ich vermute, dass es an der Methode rechne() liegt..

Joah, gut vermutet 🙂

Was liefert dir denn operanden.top() ? ich vermute ein Integer? Du probierst aber auf String zu casten und dann Integer.valueOf ? Wenn top() bereits ein Integer liefert, würde das ja keinen Sinn machen 😀

Achja und : http://www.java-forum.org/top-fragen/1350-vergleichen-strings.html 😉
 
Danke, aber der Inhalt ist ja kein Integer, sondern ein StringBuilder
Siehe:
Java:
TaschenrechnerUIJWindow.operanden.push(TaschenrechnerUIJWindow.operandenstrings.toString());
Deswegen kann ich ja nicht einfach schreiben:
Java:
 int operandaint = TaschenrechnerUIJWindow.operanden.top();
Wie könnte man es denn sonst schreiben?
 
Ist aber doch kein Integer.
???:L

Danke, aber der Inhalt ist ja kein Integer

Naja, die Fehlermeldung sagt ja was anderes ! TaschenrechnerUIJWindow.operanden ...was liefert top() ? Die Frage hast du leider nicht beantwortet und was du mit dem StringBuilder sagen willst, verstehe ich auch nicht, der hat keine top() / push() Methoden.

Was ich mir hier vorstellen kann ist, dass du dort eine Art Stack gebaut hast und dort eben deine Operanden + Operatoren ablegst. (also z.B. dort enthalten ist [5, "+", 5]. Jetzt aber mit top() eine Zahl = Integer holst, die kannste natürlich nicht einfach so auf String casten...Also quasi die Aufrufe vertauschst hast, denn Zeile 38 müsste dann vor Zeile 36 aufgerufen werden in dem Fall! (allerdings verstehe ich den Cast auf String Allgemein nicht ;( )

Fakt ist, du hast hier einen Integer den du versuchst zu String zu casten (aber anscheinend sieht das Extemefall anders, vllt. kann er also mehr dazu sagen...)
 
TaschenrechnerUIJWindow.operanden.top(); sollte einen StringBuilder zurückliefern. Es handelt sich um einen Stack, der einen StringBuilder über die push() Methode bekommen hat. Dieser StringBuilder wurde zum String über die Methode toString().

Was ich mir hier vorstellen kann ist, dass du dort eine Art Stack gebaut hast und dort eben deine Operanden + Operatoren ablegst. (also z.B. dort enthalten ist [5, "+", 5].
Genau so ist es. Ein Stack für die Operatoren und einen für die Operanden.

Der Stack erhält ja ein StringBuilder Objekt. Daher weiß ich nicht, wie ich damit rechnen kann. Ich gehe davon aus, dass Extremefall meint, dass mittels push keine Zahl sondern ein StringBuilder übergeben wurde.
 
Ohne zu wissen, wie TaschenrechnerUIJWindow aussieht (speziell die top und die push methode) kann ich da so auch nix sagen
 
Einmal läuft die Konvertierung ja durch. Daher würd ich vermuten, dass du einfach teilweise falsche Werte in deinem Stack gespeichert hast. Biste denn mal mit dem Debugger durchgegangen, um zu gucken, was wirklich zu diesem Zeitpunkt auf dem Stack liegt? Oder hast du dir Methoden geschrieben, die dir den Stackinhalt einfach jederzeit ausgeben können? Allerdings kann ich deine Cast-Struktur auch nicht ganz nachvollziehen, da wären die genannten Methoden wirklich hilfreich.
 

Zurück
Oben