Fehlerhafter Stacktrace

Cola_Colin

Top Contributor
Ich habe gerade ungefähr sowas versucht:

Java:
public class KSKB {
	
	public static void main(String[] args) {
		ValueHolder integer = new ValueHolder();
		ValueHolder string = new ValueHolder();
		string.setValue("foobar");
		synchronizeValueModels(integer, string, new WeirdConverter());
	}
	
	public static interface SynchronizationConverter<P, S> {
		S primaryToSecondary(P primary);
		P secondaryToPrimary(S secondary);
	}
	
	public static class ValueHolder {
		private Object value;
		public Object getValue() {
			return value;
		}
		public void setValue(Object value) {
			this.value = value;
		}
	}
	
	@SuppressWarnings("unchecked")
	public static <P, S> void synchronizeValueModels(ValueHolder primary, ValueHolder secondary, SynchronizationConverter<P, S> converter) {
		primary.setValue(converter.secondaryToPrimary((S)secondary.getValue()));
		// ... never executed from here on
	}

	public static class WeirdConverter implements SynchronizationConverter<String, Integer>{
		@Override
		public Integer primaryToSecondary(String primary) {
			return Integer.parseInt(primary);
		}

		@Override
		public String secondaryToPrimary(Integer secondary) {
			return String.valueOf(secondary);
		}
	}
}

In diesem Beispiel gibt es diese Exception:
Code:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at KSKB$WeirdConverter.secondaryToPrimary(KSKB.java:1) 
	at KSKB.synchronizeValueModels(KSKB.java:28)
	at KSKB.main(KSKB.java:8)

Wieso es die gibt, ist klar, in dem einen ValueHolder ist schlich ein String statt dem erwarteten Integer.
Nur was soll dieser Stacktrace ? Wieso hat der als letzte Zeile KSKB:1 ? Der Fehler tritt doch schon in der Zeile davor auf ?
Bei meinem produktivcode lag die letzte Zeile nicht auf 1, sondern auf 7, was dieser Zeile entsprach:

Java:
public class StringCOEConverter implements SynchronizationConverter<String, COEPort> {

Hat mich ein wenig verwirrt das ganze.
Wie kommt es dazu ?!
 

Cola_Colin

Top Contributor
Im eigentlichen Code war nur das Interface eine statische innere Klasse.
Wieso führt das zu solchen Fehlern im Stacktrace ? Google hat mir dazu zumindest auf die schnelle nichts gebracht.
Die angegebene Zeile liegt teils einfach im nichts :S
 

tfa

Top Contributor
Wohl eher static nested class. static inner class gibt es nicht.

@Cola_Colin: Bist du sicher, dass der Quelltext dem Bytecode entspricht, den du ausführst? Vielleicht einfach mal ein "clean all" machen.
 

Cola_Colin

Top Contributor
Ich hatte im eigentlichen Code testweise ein paar Leerzeilen eingefügt und die Zeilennummer passte sich an.
Sollte also wirklich der Code gewesen sein.
 
A

Andgalf

Gast
Wohl eher static nested class. static inner class gibt es nicht.

Stimmt natürlich, sorry für die ungenauigkeit.

Im eigentlichen Code war nur das Interface eine statische innere Klasse.

Also wenn ich den Stacktrace nicht ganz falsch deute dann war/ist auch WeirdConverter eine nested class in KSKB zu erkennen an dem $

KSKB$WeirdConverter
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
also ich erhalte auch Zeile 1, das ist relativ normal, falls nicht irgendwo besser gebaut,

irgendwie gibts mit den inneren Klassen Probleme, aber man erhält ja immerhin Klassenname und Methode,
diese kleine Einschränkung ist zu verkraften
 

tfa

Top Contributor
Sieht bei mir genau so aus. Vielleicht liegt es auch am Compiler (habt ihr alle mit Eclipse getestet?)
Wie sieht es mit dem JDK-Compiler aus?
 

Ähnliche Java Themen

Neue Themen


Oben