Archief - [PROG][JAVA] Stack: Object casten to int

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

neo_rej

Legacy Member
Ik heb dus een stack, als ik er een element wil "uitpoppen" geeft mij dat dus een Object weer. maar ik heb dit nodig als een int.

Dit is mijn code:

Code:
import javax.swing.*;
import java.util.Stack;
public class BerekenPostFixTest
{
	public static void main(String args[])
	{
		String a = JOptionPane.showInputDialog("Geef een postfix uitdruking in");
		if(berekenPostFix(a)!=null)
		{
			JOptionPane.showMessageDialog(null, "De uitkomst van de uitdrukking is " + berekenPostFix(a));
		}
	}
	public static String berekenPostFix(String input)
	{
		Stack s = new Stack();
		char in[] = input.toCharArray();
		char symbool;
		int lengte = in.length;
		int argument1 = 0;
		int argument2 = 0;
		String resultaat = "";
		Integer tresultaat = 0;
		for(int teller = 0; teller < in.length; teller++)
		{
			System.out.println(in[teller]);
			symbool = in[teller];
			if(symbool == '+' || symbool == '-' || symbool == '*' || symbool == '/')
			{
				if(s.isEmpty())
				{
					JOptionPane.showMessageDialog(null, "Fout: Illegale expressie\nEr zijn geen getallen in gegeven");
					resultaat = "0";
					return null;
				}
				else
				{
					Integer objectInteger = (Integer)s.pop();
					argument1 = objectInteger.intValue();
				}
				if(s.isEmpty())
				{
					JOptionPane.showMessageDialog(null, "Fout: Illegale expressie\nEr is maar 1 getal ingegeven");
					resultaat = "0";
					return null;
				}
				else
				{
					Integer objectInteger = (Integer)s.pop();
					argument2 = objectInteger.intValue();
				}
				if(symbool == '-')
				{
					tresultaat = (Integer)argument2-(Integer)argument1;
				}
				if(symbool == '+')
				{
					tresultaat =  (Integer)argument2+(Integer)argument1;
				}
				if(symbool == '*')
				{
					tresultaat =  (Integer)argument2*(Integer)argument1;
				}
				if(symbool == '+')
				{
					tresultaat =  (Integer)argument2/(Integer)argument1;
				}
				s.push(tresultaat);
			}
			else
			{
				s.push(symbool);
			}
		}
		if(!s.isEmpty())
		{
			Integer objectInteger = (Integer)s.pop();
			tresultaat = objectInteger.intValue();
		}
		else
		{
			JOptionPane.showMessageDialog(null, "Fout: Illegale expressie");
			resultaat = "0";
			return null;
		}
		if(s.isEmpty())
		{
			resultaat += tresultaat;
			return resultaat;
		}
		else
		{
			JOptionPane.showMessageDialog(null, "Fout: Illegale expressie");
			resultaat = "0";
			return null;
		}
	}
}

Dus dit is de code waar ik het over heb:

Integer objectInteger = (Integer)s.pop();
argument1 = objectInteger.intValue();

ik kan perfect compileren, maar bij het runnen krijg ik een classCastException.

Iemand een id hoe je dit kunt verhelpen?

Grtz

.Acku.

Legacy Member
Omdat het karakters (char) zijn en geen integers (int)

Char kan je wel naar int omzetten en omgekeerd, maar dan enkel als ASCII value.
char a = 'a';
int b = a;
//b is 64 ofzo

.Acku.

Legacy Member
Integer objectInteger = (Integer)s.pop();
argument1 = objectInteger.intValue();

naar

Character objectInteger = (Character)s.pop();
char argument1 = objectInteger.charValue();

neo_rej

Legacy Member
Code:
import javax.swing.*;
import java.util.Stack;
public class BerekenPostFixTest
{
	public static void main(String args[])
	{
		String a = JOptionPane.showInputDialog("Geef een postfix uitdruking in");
		if(berekenPostFix(a)!=null)
		{
			JOptionPane.showMessageDialog(null, "De uitkomst van de uitdrukking is " + berekenPostFix(a));
		}
	}
	public static String berekenPostFix(String input)
	{
		Stack s = new Stack();
		char in[] = input.toCharArray();
		char symbool;
		int lengte = in.length;
		char argument1;
		char argument2;
		char tres;
		int arg1 = 0, arg2 = 0;
		String resultaat = "";
		int tresultaat = 0;
		for(int teller = 0; teller < in.length; teller++)
		{
			System.out.println(in[teller]);
			symbool = in[teller];
			if(symbool == '+' || symbool == '-' || symbool == '*' || symbool == '/')
			{
				if(s.isEmpty())
				{
					JOptionPane.showMessageDialog(null, "Fout: Illegale expressie\nEr zijn geen getallen in gegeven");
					resultaat = "0";
					return null;
				}
				else
				{
					[LIJN39]Character objectCharacter = (Character)s.pop();
					argument1 = objectCharacter.charValue();
					arg1 = argument1;
				}
				if(s.isEmpty())
				{
					JOptionPane.showMessageDialog(null, "Fout: Illegale expressie\nEr is maar 1 getal ingegeven");
					resultaat = "0";
					return null;
				}
				else
				{
					Character objectCharacter = (Character)s.pop();
					argument2 = objectCharacter.charValue();
					arg2 = argument2;
				}
				if(symbool == '-')
				{
					tresultaat = arg2-arg1;
				}
				if(symbool == '+')
				{
					tresultaat =  arg2+arg1;
				}
				if(symbool == '*')
				{
					tresultaat =  arg2*arg1;
				}
				if(symbool == '+')
				{
					tresultaat =  arg2/arg1;
				}
				s.push(tresultaat);
			}
			else
			{
				s.push(symbool);
			}
		}
		if(!s.isEmpty())
		{
			Character objectCharacter = (Character)s.pop();
			tres = objectCharacter.charValue();
			tresultaat = tres;
		}
		else
		{
			JOptionPane.showMessageDialog(null, "Fout: Illegale expressie");
			resultaat = "0";
			return null;
		}
		if(s.isEmpty())
		{
			resultaat += tresultaat;
			return resultaat;
		}
		else
		{
			JOptionPane.showMessageDialog(null, "Fout: Illegale expressie");
			resultaat = "0";
			return null;
		}
	}
}

en als ik nu uitvoer krijg ik volgende fout:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
at BerekenPostFixTest.berekenPostFix(BerekenPostFixTest.java:39)
at BerekenPostFixTest.main(BerekenPostFixTest.java:8)

lijn 39 heb ik in de code aangeduid. Nu vraag ik mij af waarvan die Integer komt waar hij over spreekt, ik gebruik die nergens meer.

.Acku.

Legacy Member
Dat is de nadelige kant aan het 1.5 autoboxing-mechanisme, I guess.
Je kan enkel Objects meegeven aan een collectie zoals Stack, zodoende wrapped Java uw primitive var (char in dit geval) in een Object Wrapper (Integer).
Hij zou da moeten wrappen naar Character maar door auto-promotion (een andere feature) worden chars eerst omgezet naar ints alvorens ermee gerekend wordt. Zodoende.

Maw:
s.push(new Character(symbool));

Kn0t

Legacy Member
Vreemd :) Maar goed om weten.

Ik werk nog steeds met java 1.4, en die autoboxing is niet echt iets wat ik momenteel mis.

En als je met een Stack<Character> werkt? Wrapped ie dan ook naar Integer?

loopylama

Legacy Member
char=>String

en dan die string Integer.parseInt()??

dan ebde uwen integer

neo_rej

Legacy Member
ok, problem solved :)
De fout was eigelijk zoals je zei dat ik een char op de stack pushte en er een Integer wou uithalen, dus heb ik het eigelijk opgelost door van die char een int te maken en die te pushen.
probleempje onderweg was idd die ASCII value die hij opslaat ipv de werkelijke waarde die opgeslagen zit.

oplossing: s.push(Integer.parseInt(""+symbool));

waarin symbool een char is.

dus thx voor alle replies :) opdracht volbracht
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan