ClassCastException

Status
Nicht offen für weitere Antworten.

raven

Bekanntes Mitglied
Hallo,

Ich bins mal wieder. Ich bekommen in mein game eine ClassCastException.
Und so sieht sie aus:
Code:
Exception in thread "Thread-1" java.lang.ClassCastException: cannot assign instance of PlayerObject to field PlayerObject.name of type java.lang.String in instance of PlayerObject
        at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2004)
        at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1184)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1914)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1832)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1719)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
        at Client.run(Client.java:36)

laut Exception liegt der Fehler hier:
Code:
public void run() {
			try {
				PlayerObject playerVector;
				while((playerVector = (PlayerObject)objectIn.readObject()) != null) {
					if(bg.players.size() == 0) {
						bg.players.add(playerVector);
					} else {
						for(int i = 0; i < bg.players.size(); i++) {
							PlayerObject player = (PlayerObject)bg.players.get(i);
							if(playerVector.name.equals(player.name)) {
								bg.players.setElementAt(playerVector, i);
								i = bg.players.size();
							} else {
								if(i == bg.players.size() - 1)
									bg.players.add(bg.players.size(), playerVector);
							}
						}
					}
				}
			}
			catch(IOException e) {
				System.out.println("Server is disconnected.");
				System.exit(1);
			}
			catch(ClassNotFoundException e) {
				System.err.println("ClassLoader couldn't be found.");
			}
	}

In der Zeil, wo die While schleifenbedingung steht, ist leut exception der Fehler. Ich weiß aber nicht was ich falsch mache. Seht ih den Fehler?

mfg X_Master
 

L-ectron-X

Gesperrter Benutzer
Wie hast du denn die String-Variable name in playerVector und players deklariert?
Statisch? Public?
Am besten ist, wenn du eine öffentliche Methode in die Klasse einbaust, die dir den Namen des Spielers zurückgibt.
 

raven

Bekanntes Mitglied
habs mit ner methode probiert und habe auch mal den inhalt der while schleife auskommentiert, beides funktioniert nicht. liegt definitiv an der bedingung.

die exception sieht nach der auskommentierung des schleifeninhalts allerdings nur noc so aus.

Code:
Exception in thread "Thread-1" java.lang.ClassCastException: java.lang.String
        at Client.run(Client.java:34)
 

raven

Bekanntes Mitglied
Code:
import java.io.Serializable;

public class PlayerObject implements Serializable {

	public String name = "";

	public float x;
	public float y;

	public int energy = 100;

	public int w;
	public int h;
	public int alphaT;
	public int alphaC;

	public PlayerObject() { }

	public PlayerObject(String name, float x, float y, int w, int h, int alphaT, int alphaC) {
		this.name = name;
		this.x = x;
		this.y = y;
		this.w = w;
		this.h = h;
		this.alphaT = alphaT;
		this.alphaC = alphaC;
	}
}

Und readObject ist doch die fertige Methode die ich zum übertragen des Objectes benutze?
 

Yzebär

Bekanntes Mitglied
X_Master hat gesagt.:
Und readObject ist doch die fertige Methode die ich zum übertragen des Objectes benutze?

Die Methode ist auch interessant, weil ja beim casten des Rückgabewertes irgendwas schief geht...
EDIT: Bist du sicher, daß das Objekt richtig serialisiert wurde?
 

Illuvatar

Top Contributor
Ich plädiere auf Workspace cleanen (oder etwas vergleichbares, wenn kein eclipse) und neu kompilieren.
Oder stammen die serialialisierten Daten aus einer älteren Version, wo das Feld name vom Typ PlayerObject war?
 

Yzebär

Bekanntes Mitglied
Ich wußte es doch... Google ist des Prgrammierers bester Freund...

Bsp von Java ist auch eine Insel
Code:
  static void deserialize( String filename )
  {
    try
    {
      FileInputStream file = new FileInputStream( filename );
      ObjectInputStream o = new ObjectInputStream( file );
      String string = (String) o.readObject();
      Date date = (Date) o.readObject();
      o.close();
      System.out.println( string );
      System.out.println( date );
    }
    catch ( IOException e ) { System.err.println( e ); }
    catch ( ClassNotFoundException e ) { System.err.println( e ); }
  }

Demnach liest readObject immer das nächste Objekt aus dem Strom. In deinem Fall zuerst den String name, den du dann fälschlicherweise in ein PlayerObject casten möchtest...
 

raven

Bekanntes Mitglied
Illuvatar hat gesagt.:
IOder stammen die serialialisierten Daten aus einer älteren Version, wo das Feld name vom Typ PlayerObject war?

JA, ich überschreibe das Object doch immer wieder mit dem Object, welches ich mit readObject() lese, das ist nur so eine art zwischenspeicher, damit ich es verarbeiten kann.
 

Illuvatar

Top Contributor
Ist hier eigentlich allen klar, was die Fehlermeldung bedeutet? Die sagt, dass *während dem Deserialisieren* versucht wird, dem Feld PlayerObject#name ein Objekt des Typs PlayerObject zuzuweisen...

Das heißt, dass die serialisierten Daten irgendwie nicht zu der Klassendefinition passen.

JA, ich überschreibe das Object doch immer wieder mit dem Object, welches ich mit readObject() lese, das ist nur so eine art zwischenspeicher, damit ich es verarbeiten kann.
Das hat leider imo nix mit meiner Frage zu tun ;)
 

raven

Bekanntes Mitglied
Illuvatar hat gesagt.:
Die sagt, dass *während dem Deserialisieren* versucht wird, dem Feld PlayerObject#name ein Objekt des Typs PlayerObject zuzuweisen...

Aber ich weiße das PlayerObject doch wieder dem PlayerObject zu. Ich mache da nicht mit name. außer die eine Abfrage, wo ich teste ob beide namen gleich sind. Wie soll ich das verstehen. mfg X_Master
 

Illuvatar

Top Contributor
Aber du machst ja readIn.readObject(). Und das liest eben die Datei, und - so wie ich das verstehe - steht in der Datei sozusagen drin, dass an die name-Variable des neuen, gelesenen Objektes ein Objekt des Typs PlayerObject zugewiesen werden soll. Und das gibt eben einen Fehler.

=> Versuch nochmal neu zu kompilieren, oder die Datei, aus der du die Objekte liest, neu zu erzeugen.
 

raven

Bekanntes Mitglied
Ich hab neukopaliert. Manchmal kommt die exdeption, und manchmal halt nicht. Das Object, welches ich da lese, ist eigentlich immmer das gleiche, ich überschreibe es ja nur. Und den Selben aufruf mache ich im Server programm auch, wenn ich das Object an den server schicke. nur kommt die Exception, wenn ich es vom Clienten empfangen will. Verstehe das nicht. mfg X_Master
 
S

Spacerat

Gast
Den Fehler würd' ich in den readObject bzw. writeObject - Methoden suchen. Dort steht irgendwann ein PlayerObject im Datenstrom, obwohl ein String erwartet wird.

Gegebenenfalls müssen diese Methoden selbst implementiert werden. Wenn z.B. PlayerObject.name irgendwann mal null ist, wird es gar nicht serialisiert. Bei der deserialisierung gibt's dann derartige Exceptions.

Code:
private void writeObject(ObjectOutputStream out)
throws IOException
{
    out.writeObject((name != null && String.class.isInstance(name))? name : "");
    out.write..... // alle relevanten Daten von PlayerObject lesen
}

private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
{
    name = (String) in.readObject();
    XXX = in.read..... // analog zu writeObject die restlichen Daten lesen
}

cu Spacerat
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L ClassCastException (JavaMail API) Allgemeine Java-Themen 3
P ClassCastException bei Verwendung eines Interfaces Allgemeine Java-Themen 7
G ClassCastException Allgemeine Java-Themen 17
A Vererbung Klassen-Downcasting wirft ClassCastException Allgemeine Java-Themen 2
S OOP ClassCastException bei casting von eigener Klasse aus Iterator Allgemeine Java-Themen 3
F Interpreter-Fehler ClassCastException wird bei Schleifenaufruf geworfen Allgemeine Java-Themen 8
T java.lang.ClassCastException: Allgemeine Java-Themen 4
C java.lang.ClassCastException Allgemeine Java-Themen 3
T java.lang.ClassCastException Allgemeine Java-Themen 7
SuperSeppel13 ClassCastException Allgemeine Java-Themen 6
W java.lang.ClassCastException Allgemeine Java-Themen 10
H setWrappedData -> classcastexception Allgemeine Java-Themen 2
G java.lang.ClassCastException Allgemeine Java-Themen 3
G Dubiose ClassCastException in typisierter Map Allgemeine Java-Themen 4
B ClassCastException Allgemeine Java-Themen 2
V ClassCastException bei ArrayList Allgemeine Java-Themen 5
S Problem mit generics -> ClassCastException und ka wieso Allgemeine Java-Themen 20
B ClassCastException Allgemeine Java-Themen 17
S classCastException Allgemeine Java-Themen 4
S ClassCastException beim Casten in eine Klasse Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben