String zu Objekt einer eigenen Klasse casten

Hallo liebes Forum,

Ich habe mich jetzt hier mal angemeldet, da mir das große Google nicht weiter helfen konnte...

Folgendes Problem:
Ich muss einen String in ein Objekt einer selbst erstellten Klasse casten.

Um mir selbst etwas mehr in Java beizubringen, versuche ich mich nämlich gerade daran, die Grundstruktur eines Spiels zu entwickeln und muss, damit der Inhalt desselben bequem editierbar bleibt (in einem Editor) jetzt die darin enthaltenen Karten, bzw Levels abspeichern. Speichern scheint gut zu funktionieren, hab mir jede Zeile asugeben lassen, alles an Ort und Stelle. Nur beim Auslesen bekomme ich dieses Problem.

Da es bei dem File für die Optionen, wo ich jedoch nur primitive Dateitypen und Strings brauchte, prima geklappt hat, einen DataInputStream, bzw DataOutputStream zu benutzen (wo ja einzelne Zeilen als Strings hintereinander abgespeichert werden), wollte ich dasselbe System auch bei den Karten anwenden. Jedoch sind diese zur Strukturierung in Zellen aufgeteilt, also Objekte meiner selbst erstellten Klasse Cell. Und nachdem ich alle Zeilen erfolgreich (habe mir wieder alles ausgeben lassen) in eine Queue eingelesen habe, muss ich diese nun in die Cell casten - was mir immer wieder Fehler beschert.

Momentan probiere ich es noch so:
Java:
Object lString = new String(lOptions.front().toString());
iCells[i][j] = (Cell) lString;
lOptions.dequeue();
lOptions ist bereits initialisiert. Es handelt sich um eine Queue aus dem Informatikunterricht, in welche die einzelnen Zeilen der Datei hintereinander eingelesen sind. Ich habe den Inhalt überprüft und ich bin mir sicher, dass der Inhalt richtig ist. front() gibt das nächste Element aus, dequeue() löscht es und macht Platz für das nächste.

iCells ist das mehrdimensionale Array vom Typ Cell (meine Klasse), in welchem die Zellen gelagert werden.

i und j werden dabei von einer verschachtelten for-Schleife durchlaufen. Diese funktioniert auf jeden Fall einwandfrei. Diese Schleifen sorgen auch dafür, dass der oben geschriebene Code mehrmals aufgerufen wird.

Der Fehler den ich erhalte, ist Folgender (durch eine catch-Verzweigung erhalten):
Code:
java.lang.ClassCastException: java.lang.String cannot be cast to Cell
 
S

SlaterB

Gast
praktisch niemand muss jemals new String() aufrufen, wenn du sowas siehts, gedanklich gleich streichen,

Object lString = lOptions.front().toString();
macht dasselbe

------

toString() liefert immer einen String, und einen String kannst du nicht casten,
ein String ist und bleibt ein String

vielleicht
Object o = lOptions.front();
iCells[j] = (Cell) o;
 

Landei

Top Contributor
... und einen String kannst du nicht casten,
ein String ist und bleibt ein String

<klugscheiß>Das stimmt nicht ganz, man kann einen String erfolgreich zu Object, Serializable, Comparable<String> und CharSequence casten.</klugscheiß>

Aber das geht nur, weil er das ja (auch) schon ist. Tomaten in Gemüse casten geht, aber Tomaten in Elefanten casten geht nicht.
 
Object lString = lOptions.front().toString();
macht dasselbe
Da war ich mir noch nicht so ganz sicher - bei meinen Experimenten schien es mir, dass es einen Unterschied macht, zumindest bei den primitiven Datentypen ein Objekt, statt den Datentyp sebst zu erzeugen (also "new Integer(int i)", statt nur "int i")

vielleicht
Object o = lOptions.front();
iCells[j] = (Cell) o;

Hatte ich auch schon mal, selber Fehler.
Code:
java.lang.ClassCastException: java.lang.String cannot be cast to Cell
Sicherheitshalber habe ich noch einmal die Methode front() herausgesucht, die gibt auf jeden Fall ein Object zurück:
Java:
public Object front()
{	Object item = null;
	if (!this.isEmpty())
	{
		item = this.first.getItem();
	}
	return item;
}

Tomaten in Gemüse casten geht, aber Tomaten in Elefanten casten geht nicht.
Liegt hier vielleicht der Fehler? Wenn ich doch aus einem Object einen String machen kann, warum gibt es dann keine Möglichkeit, diesen Vorgang umzudrehen?
 
S

SlaterB

Gast
wenn du von einem Auto ein Foto machen kannst, dann ist das Umdrehen nicht ganz so leicht..,
es sei denn du weißt ganz genau wie das Auto aufzubauen ist, das Foto z.B. ein Bauplan ist und du danach in einer Fabrik ein neues Auto zusammensetzt, das wäre halbwegs denkbar,

was steht denn nun genau in dem String, was macht eine 'Cell' aus?
aus einem String "x=4, y=5" könnte man die beiden Ziffern mühevoll extrahieren und einen Konstruktor new Cell(x,y) aufrufen, falls vorhanden,

nur mit den Fingern schnipsen wird aber nichts bewirken
 

Landei

Top Contributor
Liegt hier vielleicht der Fehler? Wenn ich doch aus einem Object einen String machen kann, warum gibt es dann keine Möglichkeit, diesen Vorgang umzudrehen?

Du kannst versuchen, den Vorgang umzudrehen, also aus dem Gemüse wieder eine Tomate zu machen. Wenn's aber Spinat war, geht das mit einer ClassCastException krachen.

Eigentlich ist es ganz einfach: Eine Instanz irgendwo im Speicher hat immer einen "echten" Typ (z.B. das, was man mit instance.getClass() abfragen kann), aber die Referenzen auf dieses Stückchen Speicher können durchaus einen anderen Typ haben, entweder den einer Oberklasse oder eines implementierten Interfaces. Das tut man, weil der "exakte" Typ in einem bestimmten Kontext oft nicht wichtig ist: Ein TreeSet interessiert vor allem, dass seine Elemente sortierbar sind und nicht, ob es Tomaten oder Elefanten sind.
 
was steht denn nun genau in dem String, was macht eine 'Cell' aus?
Eine Zelle ist bei mir ein dynamischer datentyp, in mehreren ArrayLists werden die Inhalte dieser Zellen abgespeichert. Um jeden Wert aus diesen einzeln in einen File zu schreiben, müsste ich mich bzw mein programm sich ganz schön verrenken - Vor allem, weil ich es soweit übersichtlich halten möchte, dass ich in späteren Versionen möglichst einfach Dinge hinzufügen kann. Wenn ich mit dieser Technik die Klasse Zelle verändern möchte, aus welchem Grund auch immer, dann müsste ich jedesmal den ganzen Speicherscript wieder mühsam überarbeiten.
 
WHOHOO! Es funktioniert!

Ich habe statt einem DataInputStream jetzt einen ObjectInputStream verwendet und den Code generell überarbeitet. Trotzdem danke für die wirklich schnelle Hilfe!
 
Klingt aber auch nach einer ziemlich gefrickelten Variante.

Java:
public Map(String pPath)    // Load a map
    {
        iPath = pPath;

        ObjectInputStream in = null;   

        try
        {
            in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(iPath)));  // Open a file stream

            iName = in.readUTF();   // reads a String

            iCellsWidth = in.readInt();     // reads an int
            iCellsHeight = in.readInt();
            System.out.println("Map Size: " + iCellsWidth + ", " + iCellsHeight);   // For check purposes

            iCells = new Cell[iCellsWidth][iCellsHeight];   // The Cell Array is declared

            int lCounter = 1;   // For check purposes, too
            for(int i = 0; i < iCellsWidth; i++)
            {
                for(int j = 0; j < iCellsHeight; j++)
                {
                    Object lObject = in.readObject();       // reads an Object
                    iCells[i][j] = (Cell) lObject;      // casts it back to Cell
                    System.out.println("Step " + lCounter + " (" + i + ", " + j + "): " + iCells[i][j]);
                    lCounter++;
                }
            }

            in.close();

            System.out.println("Map " + iName + " loaded");
        }
        catch (Exception e)
	{
	    System.err.println ("Error reading Map File: " + e.toString());
        }
    }
Ich finde, es schaut ganz vernünftig aus^^

Die Speicherung verläuft ähnlich, da war es vor Allem natürlich wichtig darauf zu achten, dass Name, Map-größe und die Zellen in der richtigen Reihenfolge abgerufen werden.
 
M

maki

Gast
"gefrickelt" finde ich sehr diplomatisch wenn ich den Code so sehe, "vernünftig" ist er auf keinen Fall.

Dir ist klar, dass wenn du die Cell Klasse änderst, deine serialisierten Objekte nicht mehr geladen werden können?

Namenskonventionen gibt es aus guten Gründen, und der lautet nicht dass du deine eigenen erfindest, was zu Henker soll das Präfix "i" darstellen?
Dass die Hungarian Notation Schrott ist hat sogar MS mittlerweile eingesehen.

Nicht entmutigen lassen, aber bitte auch keine Ratschläge in den Wind schlagen aus unverständnis ;)
 

Noctarius

Top Contributor
Ich würde ja zu einem eigenen (z.B. XML-basiertem) Datenformat raten. Dies kann man beliebig erweitern.

Schreiben kann man es ganz einfach (im schlimmsten Fall durch Concatination) und lesen z.B. sehr simpel mit dem Ding in der Signatur.

Die normale Java Serialisierung als Bytestream hat halt einige Nachteile. Der schlimmste, den maki schon genannt hat: Wenn du deine Cell Klasse mal erweitern willst lassen sich die Daten nicht mehr einlesen (ohne Tricks).
 
was zu Henker soll das Präfix "i" darstellen?
i wie instance, das soll mir einfach zeigen, dann es sich um eine Instanzvariable handelt - So zumindest habe ich es in der Schule gelernt (bin gerade in der 12. Klasse und dies alles hier geht bereits eine ganze Ecke über das Abi hinaus)

Ich würde ja zu einem eigenen (z.B. XML-basiertem) Datenformat raten. Dies kann man beliebig erweitern.
Ich habe mir ehrlich gesagt keine Gedanken über andere Speichermöglichkeiten gemacht, da in den Tutorials, die ich gefunden habe, lediglich Streams behandelt werden.

Und ist erweitern nicht doch möglich? Wenn mir nach Abruf des Streams Daten fehlen, kann ich die Speicherplätze doch einfach mit Standartwerten belegen?

EDIT: Das letzte nehme ich zurück, habe es grad mal ausprobiert, der Cell Klasse eine weitere Instanzvariable zu geben.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Durch String Platform Game erstellen Spiele- und Multimedia-Programmierung 8
Androbin Funktions-Plotter: String "ausrechnen" Spiele- und Multimedia-Programmierung 2
D Java Variable nach String benennen Spiele- und Multimedia-Programmierung 13
S Wichtig! String an TextArea übergeben Spiele- und Multimedia-Programmierung 3
pcfreak9000 Objekt-Vorlagen Spiele- und Multimedia-Programmierung 0
Arif Maus-Objekt im Player Klasse implementieren !? Spiele- und Multimedia-Programmierung 2
H Objekt der Klasse A in der Klasse B verwenden und manipulieren Spiele- und Multimedia-Programmierung 6
M [JOGL] Maus über einem gezeichnetem Objekt abfragen? Spiele- und Multimedia-Programmierung 5
U Kann nur ein Objekt mit LWJGL rendern Spiele- und Multimedia-Programmierung 2
kaoZ Graphics Objekt liefert null Spiele- und Multimedia-Programmierung 14
E Java3D Objekt skalieren per JSlider/JButton Spiele- und Multimedia-Programmierung 10
D Probleme mit objekt initializirung mit Mouselistener Spiele- und Multimedia-Programmierung 10
S Java3D: Primitives zu einem Objekt kombinieren Spiele- und Multimedia-Programmierung 7
T LWJGL 3D Objekt Collision: Wie? Spiele- und Multimedia-Programmierung 11
S Wie erkennt ein Objekt ein anderes? Spiele- und Multimedia-Programmierung 7
B j3d mehr als ein Objekt rotieren Spiele- und Multimedia-Programmierung 18
G Hindernis vor Objekt erkennen Spiele- und Multimedia-Programmierung 6
W Java3D: Kanten die hinter einem Objekt liegen werden gezeigt Spiele- und Multimedia-Programmierung 2
S Graphics Objekt weiterreichen? Spiele- und Multimedia-Programmierung 4
H Eigenes 3D Objekt Spiele- und Multimedia-Programmierung 20
D 2D Objekt fragmentieren Spiele- und Multimedia-Programmierung 3
V Jogl: Objekt trotz Rotation immer in gleiche Richtung bewegen Spiele- und Multimedia-Programmierung 5
M [J3D]Dynamische Erzeugung vom Objekt Box Spiele- und Multimedia-Programmierung 5
Kr0e OpenGL .. Pixel Buffer Objekt oder Frame Buffer Object? Spiele- und Multimedia-Programmierung 2
N Objekt entgegengesetzt bewegen Spiele- und Multimedia-Programmierung 8
M BoundingBox ist nicht bündig am Objekt Spiele- und Multimedia-Programmierung 5
K Kanten anzeigen lassen in einem Shape3D-Objekt Spiele- und Multimedia-Programmierung 4
S geladenes Objekt -> Material Zuweisen. Spiele- und Multimedia-Programmierung 4
J Picking Selection auf ein Objekt begrenzen ! Spiele- und Multimedia-Programmierung 6
C Objekt bei Buttonklick zeichnen Spiele- und Multimedia-Programmierung 16
G JOGL: per Mausbewegung Objekt verschieben Spiele- und Multimedia-Programmierung 2
C Objekt zwischen 2 Geraden? Spiele- und Multimedia-Programmierung 3
D 3D Objekt entlang Geraden Spiele- und Multimedia-Programmierung 4
Quaxli Picking: Vom Shape3D zum eigentlichen Objekt Spiele- und Multimedia-Programmierung 2
G Objekt nicht ins negative oder null skalieren Spiele- und Multimedia-Programmierung 2
G Objekt verschieben Spiele- und Multimedia-Programmierung 6
G Textur laden auf ein eingelesenes 3D Objekt Spiele- und Multimedia-Programmierung 4
I ScaleInterpolator verschiebt Objekt immer in den Ursprung. Spiele- und Multimedia-Programmierung 2
V Objekt per Tastendruck anzeigen/verschwinden lassen? Spiele- und Multimedia-Programmierung 4
R Objekt mit cos/sin verschieben Spiele- und Multimedia-Programmierung 27
G Kein Licht in Box-Objekt Spiele- und Multimedia-Programmierung 2
K Ein 3D-Objekt mit Maus auswählen Spiele- und Multimedia-Programmierung 5
D Alpha Objekt Spiele- und Multimedia-Programmierung 8
H Kompliziertes 3D-Objekt Spiele- und Multimedia-Programmierung 16
G Einen gif oder jpg Datei aus einem Graphics Objekt o. JFrame Spiele- und Multimedia-Programmierung 2
C Wie kann ich ein Objekt auf Tastendruck vor & zurück bew Spiele- und Multimedia-Programmierung 3
M Position der ViewingPlatform als Point3d-Objekt? Spiele- und Multimedia-Programmierung 12
S 3D Objekt erstellen und darstellen Spiele- und Multimedia-Programmierung 4
G RotationInterp. setzt Objekt an Ursprungsposition zurück Spiele- und Multimedia-Programmierung 2
N Shape3D Objekt auf dem Bildschirm zentrieren Spiele- und Multimedia-Programmierung 2
YangLee Ausgabe von einer Bewegung bei mehrzeiligen Strings Spiele- und Multimedia-Programmierung 1
E relevanter bereich einer isometrischen karte zeichnen (AffineTransform) Spiele- und Multimedia-Programmierung 0
M Audio Track einer Musik CD abspielen mittels vlcj-Bibliothek Spiele- und Multimedia-Programmierung 0
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
D Programmierung einer Tor-Anzeige Spiele- und Multimedia-Programmierung 8
C Optimale Wegberechnung einer KI Spiele- und Multimedia-Programmierung 6
T Pong Hilfe bei einer Website Spiele- und Multimedia-Programmierung 4
R Einfärben von Gemeinden auf einer Karte Spiele- und Multimedia-Programmierung 14
S ECS: "deep copy" einer Entity-Vorlage Spiele- und Multimedia-Programmierung 9
R Aufruf einer render-Methode Spiele- und Multimedia-Programmierung 12
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
J Frage zum Einlesen einer .wav in ein byte Array Spiele- und Multimedia-Programmierung 3
J Spielfiguren laufen lassen auf einer html Tabelle mit Hilfe von Servlets Spiele- und Multimedia-Programmierung 2
T Alle Referenzen zu einer Klasse aus Java Bytecode ersetzt, JVM sucht trotzdem diese Klasse Spiele- und Multimedia-Programmierung 1
M Kamera "am Rande einer Kugel bewegen" Spiele- und Multimedia-Programmierung 4
B Den KeyListener in einer JavaFXML Application benutzen Spiele- und Multimedia-Programmierung 2
gamebreiti Index eines Elements einer ArrayList abfragen Spiele- und Multimedia-Programmierung 1
F Das sag mir einer Java ist plattform unabhänig ! Spiele- und Multimedia-Programmierung 10
M Scrolling einer 2D Map Spiele- und Multimedia-Programmierung 8
J In einer While-Schleife auf Event warten Spiele- und Multimedia-Programmierung 3
TheSorm Collision an einer bestimmten Seite eine Rectangles abfragen Spiele- und Multimedia-Programmierung 3
windl Frage zu Airplay und zur Mitarbeit bei einer Mediaanlage Spiele- und Multimedia-Programmierung 0
A Aufbau einer JOGL Anwendung Spiele- und Multimedia-Programmierung 12
L Werte aus einer .yml Datei lesen Spiele- und Multimedia-Programmierung 9
H Java3D - Textur aufs innere einer Sphere mappen Spiele- und Multimedia-Programmierung 9
F Download und Update einer Java-Anwendung Spiele- und Multimedia-Programmierung 10
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
B Video von einer IP kamera Spiele- und Multimedia-Programmierung 5
W Java3D: Eckkoordinaten einer Box herausfinden Spiele- und Multimedia-Programmierung 18
W Rotation aller Objekte einer 3D-Szene Spiele- und Multimedia-Programmierung 8
2 Ein Zufallsweg bzw. Weg in einer 2dim Matrix finden. Spiele- und Multimedia-Programmierung 21
aze Schnittmenge zwischen Linie und einer Area wegschneiden Spiele- und Multimedia-Programmierung 3
A Bild einer Webcam auffangen Spiele- und Multimedia-Programmierung 20
G Ballerkennung aus einer Bilddatei Spiele- und Multimedia-Programmierung 24
B Generierung einer Wertetabelle aus einem Bild Spiele- und Multimedia-Programmierung 3
D Problem beim Öffnen einer PHP für eine Highscore Spiele- und Multimedia-Programmierung 5
M Realisierung einer Sichtweise in Java2D Spiele- und Multimedia-Programmierung 3
H Screenshot einer Graphics2D Anwendung erstellen Spiele- und Multimedia-Programmierung 6
F Simulation einer Magnetischen Flasche Spiele- und Multimedia-Programmierung 17
F Meine Aufgabe: Client-Server am Beispiel einer Implementation eines Tic-Tac-Toe Netzwerkspieles Spiele- und Multimedia-Programmierung 7
J Fehlverhalten einer Spielfigur Spiele- und Multimedia-Programmierung 7
N Jogl Probleme mit dem Buffer beim laden einer Textur Spiele- und Multimedia-Programmierung 2
M Das Frequenzspektrum einer WAV/MP3-Datei anzeigen Spiele- und Multimedia-Programmierung 6
M Rechteck erkennung innerhalb einer Matix Spiele- und Multimedia-Programmierung 4
S Problem beim laden eines Bildes in einer Methode Spiele- und Multimedia-Programmierung 14
E Pinball Abprall an einer schrägen Bande Spiele- und Multimedia-Programmierung 19
0x7F800000 weiß einer wozu ANTLR beim build von JOGL verwendet wird? Spiele- und Multimedia-Programmierung 3
E Hilfe bei einer GUI Programmierung mit Graph Spiele- und Multimedia-Programmierung 30
A Tutorial für die Entwicklung einer Fussball-KI gesucht Spiele- und Multimedia-Programmierung 7
S Rotation relativ zur Rotation einer anderen Transform Group Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben