Problem mit der Serialisierung

DerSophist

Mitglied
Hallo,
ich habe folgendes Problem:
Ich will ein Spiel machen, in welchem es einen Highscore geben soll. Dieser soll auch gespeichert werden, wenn ich das Programm beende.
Also habe ich einmal in die Klasse, in der der Highscore gespeichert wird, Serializable implementiert. In einer zweiten Klasse habe ich nun sozusagen den Speichervorgang niedergeschrieben. (Also, dass die Variable in ein File geschrieben wird, und auch ausgelesen werden)
Nach jeder Runde wird der Highscore nun in das File gespeichert. (Also müsste er eigentlich)
Wenn ich das Spiel jetzt aber schließe und neustarte und auf das File zugegriffen werden soll, ist der Highscore nicht gespeichert.
Was habe ich vergessen?
DerSophist
 

DerSophist

Mitglied
Speicherung:
Java:
package com.company;

import java.io.*;

public class SpeicherVorgang
{
    public static void writeHighscoreToFile () throws IOException
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("SpielDaten.bin"));
        oos.write(Var.Highscore);

    }

    public static void readHighscoreFromFile () throws IOException
    {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("SpielDaten.bin"));
        Var.Highscore = ois.read();

    }

    public SpeicherVorgang() throws IOException
    {
        readHighscoreFromFile();
    }
}
Der Highscore:
Java:
public class Var implements Serializable
{
     static int Highscore;
}
In einer anderen Klasse des Spiels:
Java:
if (Var.leben == 0) {
    if (Var.schrott > Var.Highscore)
    {
        Var.Highscore = Var.schrott;
        try {
            SpeicherVorgang.writeHighscoreToFile();
        } catch (IOException e) {
            System.out.println("Etwas hat nicht geklappt!");
        }
    }
In der Main:
Java:
package com.company;

import java.io.IOException;

public class Main 
{
    public static void main(String[] args) throws IOException {
   // write your code here
        new Gui(); //die Gui wird erstellt, wenn das Programm startet
        new Var(); //die Var wird erstellt, wenn das Programm startet
        new Label(); //das Label wird erstellt, wenn das Programm startet
        new KeyHandler(); //der KeyHandler wird erstellt, wenn das Programm startet
        new Background(); //das Background-Verhalten wird erstellt, wenn das Programm startet
        new PlayerMovement();
        new FlammenAnimation();
        new GegnerMovement();
        new SchrottMovement();
        new GegnerKollision();
        new SchrottKollision();
        new Explosion();
        new ActionHandler();
        new SpeicherVorgang();
    }
}
 
Zuletzt bearbeitet:

mihe7

Top Contributor
ich habe folgendes Problem:
Klasse Var mit statischen Variablen... :mad: Hast Du das zufällig aus einem YouTube-Tutorial übernommen? Der ganze Aufbau erinnert zumindest sehr daran --> Tonne. Die Highscore wird über mind. drei Klassen verteilt verwaltet.

Vermutung: irgendwo wird beim Starten die Highscore rausgeschrieben (ggf. auch vorher noch auf 0 gesetzt) und damit die gespeicherte Datei überschrieben, bevor sie dann am Ende wieder geladen wird.
 

Robat

Top Contributor
Davon abgesehen: Die Klasse, die das Highscore Attribut besitzt, muss in dem Fall nicht Serializable implementieren. Du willst ja nicht die Klasse an sich serialisieren. Vielmehr willst du nur den Highscore (einen einfachen int-Wert) abspeichern.

Ist der Fehler nicht vielmehr, dass er den zugehörigen Stream nach dem schreiben nicht schließt? Oder ist es gerade zu früh zum denken? *grübel*
Edit: (davon abgesehen ob es der Fehler ist oder nicht: Alles Streams, die du selber öffnest, solltest du auch wieder schließen. Entweder über den Aufruf der close() Methode oder über (ab Java 7) try-with-resource Blöcke)

Wie @mihe7 schon sagte .. lass die Finger von diesem YouTube-Tutorial (Name des Kanals nenn ich mal lieber nicht) .. das hat absolut gar nichts mit OOP zu tun ..
 
K

kneitzel

Gast
Och, so ein Link wäre interessant um da dann entsprechend klare Kommentare zu hinterlassen....
 

mihe7

Top Contributor
st der Fehler nicht vielmehr, dass er den zugehörigen Stream nach dem schreiben nicht schließt? Oder ist es gerade zu früh zum denken? *grübel*
Beim Schließen des Programms müsste der Stream automatisch geschlossen werden. Aber ganz ehrlich: bei diesem - nennen wir es mal - "Code" habe ich gar keine Lust, mir großartig Gedanken über die Ursachen zu machen :)

Dieses Video (oder wo das Zeug sonst noch rumgeistert) nervt einfach nur.
 
K

kneitzel

Gast
Such einfach nach Pong programmieren und Du wirst fündig :D
Oh jee. Ich gebe Dir Recht: Ich wollte das gar nicht finden :) Ich wusste er nur nicht, ehe ich es gefunden habe. Da überschlagen sich die Kommentare ja von wegen "Super Tutorial" und so ...

Irgendwie macht mich das jetzt fast sprachlos.

bei diesem - nennen wir es mal - "Code" habe ich gar keine Lust, mir großartig Gedanken über die Ursachen zu machen :)
So ging es mir schon Gestern Abend als ich es gesehen hatte. Ich wollte Antworten und wusste schon nicht, wo ich anfangen sollte. Und eine Antwort a.la. "Geh und lern Java von einer vernünftigen Quelle" mit paar Links zu Java ist auch eine Insel und so schien mir nicht wirklich hilfreich und ein "Buch schreiben" über static wollte ich hier im Forum jetzt auch nicht und darauf wäre es wohl hinaus gelaufen hätte ich gestern geantwortet....
 

DerSophist

Mitglied
Oh jee. Ich gebe Dir Recht: Ich wollte das gar nicht finden :) Ich wusste er nur nicht, ehe ich es gefunden habe. Da überschlagen sich die Kommentare ja von wegen "Super Tutorial" und so ...

Irgendwie macht mich das jetzt fast sprachlos.


So ging es mir schon Gestern Abend als ich es gesehen hatte. Ich wollte Antworten und wusste schon nicht, wo ich anfangen sollte. Und eine Antwort a.la. "Geh und lern Java von einer vernünftigen Quelle" mit paar Links zu Java ist auch eine Insel und so schien mir nicht wirklich hilfreich und ein "Buch schreiben" über static wollte ich hier im Forum jetzt auch nicht und darauf wäre es wohl hinaus gelaufen hätte ich gestern geantwortet....
Was ist denn so schlecht an dem Tutorial? Ich bin relativ neu mit Java (Syntax und ähnliches kann ich, muss aber noch die ganzen Klassen und generell Programmieren mit Java kennenlernen).
Ich dachte: Es funktioniert, also kann das ja alles nicht so schlecht sein...
Und übrigens: Es ging hier nicht darum, wie ich dieses Spiel programmiert habe, sondern um die Serialisierung.
Ich muss ehrlich sein, als ich auf den Discord von dem "Tutorial-Macher" gegangen bin, wurde mir bei meinen Fragen sehr nett, schnell, hilfsbereit und auch weiter helfend geantwortet. So etwas hätte ich mir hier auch mehr gewünscht...
Bis jetzt hat mir noch keine Antwort geholfen mein Problem zu lösen...
 

DerSophist

Mitglied
Beim Schließen des Programms müsste der Stream automatisch geschlossen werden. Aber ganz ehrlich: bei diesem - nennen wir es mal - "Code" habe ich gar keine Lust, mir großartig Gedanken über die Ursachen zu machen :)

Dieses Video (oder wo das Zeug sonst noch rumgeistert) nervt einfach nur.
Ich dachte der Sinn dieses Forums ist, fragen zu stellen. Wenn du keine Lust hast, meine Fragen zu beantworten, dann mach es halt nicht, ich würde mich nur sehr darüber freuen, wenn mir jemand bei meinem Problem weiterhelfen kann.
Das ist mein erstes richtiges Java-Projekt und sag mir, wie hättest du dich gefühlt, wenn du jemandem eine Frage gestellt hättest, und er hätte einfach nur gesagt: "Dein Code ist ja so ne Scheiße, da habe ich gar keine Lust dir zu helfen."
Das führt doch zu nichts. Das hat nichts mehr mit konstruktiver Kritik zu tun oder weiterhelfen zu tun, denn geholfen hat es mir nicht. Meckern, meckern, meckern...
Vielleicht solltest du mal aus deinem Programmierkeller herauskommen und dich in menschlicher Konversation und Hilfsbereitschaft üben ;).
 

mrBrown

Super-Moderator
Mitarbeiter
Das Tutorial macht genau die Dinge, die man in einer Objektorientierten Sprache nicht will, zB das Arbeiten mit einer Var-Klasse, die alle Variablen enthält, das ist ein absolutes Antipattern. Arbeiten mit Klassen (bzw Objekten) lernt man dabei eben nicht sinnvoll, sondern hauptsächlich Syntax und imperatives Denken.
Einige Mitglieder hier sind (verständlicherweise) entsprechend frustriert, weil man das immer wieder sieht, und es immer wieder die selben Fehler produziert.
Bevor man mit GUI anfängt, sollte man bereits die Grundlagen drauf haben, und die schließen Objektorientiertes Arbeiten ein. Das Tut macht genau das Gegenteil - mit GUIs Arbeiten, ohne entsprechende Grundlagen, und dabei gefühlt alle falsch machen, was möglich ist.


Eine Vermutung, was der Grund für den Fehler ist, hat @mihe7 ja schon geäußert (und ich bin der selben Meinung) - und der Fehler kommt durch die Struktur, die man in diesen Tutorials lernt. In dem gezeigten Code findet sich der Fehler nicht direkt, der liegt irgendwo anders, da alles public und static ist kann der irgendwo im Programm liegen - du musst einfach mal selbst gucken, wo der Highscore verändert wird.
 

DerSophist

Mitglied
Das Tutorial macht genau die Dinge, die man in einer Objektorientierten Sprache nicht will, zB das Arbeiten mit einer Var-Klasse, die alle Variablen enthält, das ist ein absolutes Antipattern. Arbeiten mit Klassen (bzw Objekten) lernt man dabei eben nicht sinnvoll, sondern hauptsächlich Syntax und imperatives Denken.
Einige Mitglieder hier sind (verständlicherweise) entsprechend frustriert, weil man das immer wieder sieht, und es immer wieder die selben Fehler produziert.
Bevor man mit GUI anfängt, sollte man bereits die Grundlagen drauf haben, und die schließen Objektorientiertes Arbeiten ein. Das Tut macht genau das Gegenteil - mit GUIs Arbeiten, ohne entsprechende Grundlagen, und dabei gefühlt alle falsch machen, was möglich ist.


Eine Vermutung, was der Grund für den Fehler ist, hat @mihe7 ja schon geäußert (und ich bin der selben Meinung) - und der Fehler kommt durch die Struktur, die man in diesen Tutorials lernt. In dem gezeigten Code findet sich der Fehler nicht direkt, der liegt irgendwo anders, da alles public und static ist kann der irgendwo im Programm liegen - du musst einfach mal selbst gucken, wo der Highscore verändert wird.
Wirklich weiterhelfen tut mir das nicht...
 

mrBrown

Super-Moderator
Mitarbeiter
Okay, der letzte Satz noch mal anders: irgendwo in deinem Programm wird der Highscore gesetzt (an einer hier nicht gezeigten Stelle), das passiert vermutlich nach dem Laden des gespeicherten Highscores und überschreibt diesen daher.

Entweder du zeigst den ganzen Code, oder du muss selber suchen. Wirklich helfen kann da sonst keiner, der Code oben zum Schreiben/lesen ist an sich erstmal korrekt, der Fehler liegt wie gesagt woanders :)
 

DerSophist

Mitglied
Okay, der letzte Satz noch mal anders: irgendwo in deinem Programm wird der Highscore gesetzt (an einer hier nicht gezeigten Stelle), das passiert vermutlich nach dem Laden des gespeicherten Highscores und überschreibt diesen daher.

Entweder du zeigst den ganzen Code, oder du muss selber suchen. Wirklich helfen kann da sonst keiner, der Code oben zum Schreiben/lesen ist an sich erstmal korrekt, der Fehler liegt wie gesagt woanders :)
Die Variable Highscore bzw. der SpeicherVorgang kommt nirgendwo anders vor... könnte das der Fehler sein?
 

mrBrown

Super-Moderator
Mitarbeiter
Sicher, dass dir Variable nirgendwo benutzt wird? Wenn du den Highscore nirgendwo benutzt ist klar, warum du nicht siehst, dass er gespeichert wurde...



Das Einlesen wird schon ausgeführt (wenn auch auf denkbar schlechteste Weise), das kannst du im Zweifel auch einfach mit einem System.out.print testen.
 

mihe7

Top Contributor
Ich dachte der Sinn dieses Forums ist, fragen zu stellen. Wenn du keine Lust hast, meine Fragen zu beantworten, dann mach es halt nicht, ich würde mich nur sehr darüber freuen, wenn mir jemand bei meinem Problem weiterhelfen kann.
Das ist mein erstes richtiges Java-Projekt und sag mir, wie hättest du dich gefühlt, wenn du jemandem eine Frage gestellt hättest, und er hätte einfach nur gesagt: "Dein Code ist ja so ne Scheiße, da habe ich gar keine Lust dir zu helfen."
Das führt doch zu nichts. Das hat nichts mehr mit konstruktiver Kritik zu tun oder weiterhelfen zu tun, denn geholfen hat es mir nicht. Meckern, meckern, meckern...
Vielleicht solltest du mal aus deinem Programmierkeller herauskommen und dich in menschlicher Konversation und Hilfsbereitschaft üben ;).
Da hast Du einige Dinge gewaltig missverstanden. Zunächst einmal ging es in meiner Antwort an @Robat nicht speziell um Deinen Code (von dem sieht man ja kaum was), sondern um den Aufbau des Codes aus dem "Tutorial". Wenn Du auf diese Weise die Serialisierung einbaust, verteilst Du den Spaß über mehrere Stellen und daher die Vermutung, dass Du irgendwo beim Öffnen der Anwendung die Datei überschreibst. Du hast aber zu wenig Code gezeigt, als dass man das mit Sicherheit sagen könnte. So könnte es sein, dass der Code, den Du mit "In einer anderen Klasse des Spiels" zitierst, beim Aufruf ausgeführt wird, zu diesem Zeitpunkt die Bedingungen erfüllt sind und daher die Datei überschrieben wird.

Abgesehen davon: Dir ist sicher mehr geholfen, wenn Dich jemand darauf aufmerksam macht, dass Du den grundsätzlich falschen Weg gehst, als Dir auf diesem Weg nur bei der Lösung eines akuten Problems zu helfen.
 
K

kneitzel

Gast
Also mal einfach von Anfang an:

a) Kritik an dem Tutorial solltest Du nicht auf Dich beziehen.

b) Was an dem Tutorial schlecht ist: Java ist eine Objektorientierte Sprache. Daher sollte man verstehen, was eben Objekte sind. Und dazu gehört, das man dann auch z.B massiv auf das Schlüsselwort "static" verzichtet. Anfängern hier im Forum empfehlen wir oft, auf dieses Schlüsselwort komplett (bis auf das "static void main") zu verzichten. Denn das verhindert nach meiner Erfahrung massiv die Erlernung einer Objektorientierten Sprache.

c) Dein Code - mögliche Fehler.
c1) Eine Vermutung ist, dass Du in der Logik etwas falsch machst. Evtl. stimmt die Reihenfolge von Aufrufen nicht oder etwas, das Du gerne aufrufen möchtest, wird nicht aufgerufen. Hier bietet sich die Nutzung eines Debuggers an. Oder wenn Dir das noch zu kompliziert ist: Bau mehr Ausgaben ein.
c2) Die Vermutung, die auch geäußert wurde, ist, dass Du die Daten in einen Stream schreibst. Dieser puffert die Daten zwischen (und schreibt diese nicht sofort) und dann kommt der Garbage Collector und zerstört das Objekt, ehe die Daten geschrieben werden konnten.

d) Dein Code - was daran unschön ist (und damit eine direkte Kritik an dem Tutorial ist!)

Nehmen wir uns nur einmal die main Methode um zu sehen, was die Applikation macht:
Java:
    public static void main(String[] args) throws IOException {
   // write your code here
        new Gui(); //die Gui wird erstellt, wenn das Programm startet
        new Var(); //die Var wird erstellt, wenn das Programm startet
        new Label(); //das Label wird erstellt, wenn das Programm startet
        new KeyHandler(); //der KeyHandler wird erstellt, wenn das Programm startet
        new Background(); //das Background-Verhalten wird erstellt, wenn das Programm startet
        new PlayerMovement();
        new FlammenAnimation();
        new GegnerMovement();
        new SchrottMovement();
        new GegnerKollision();
        new SchrottKollision();
        new Explosion();
        new ActionHandler();
        new SpeicherVorgang();
    }
Du erstellst eine ganze Reihe an Instanzen, aber keine Instanz scheint Dich wirklich zu interessieren, denn die erstellten Instanzen speicherst Du nicht.
Was mich daran massiv stört ist:
Das Erstellen einer neuen Instanz soll nur eine neue Instanz erzeugen. Wenn ich sage: Ich habe hier einen Bauplan von einem Haus, das Haus baue ich mir. Dann wird lediglich das Haus gebaut. Und danach möchte ich das erzeugte Haus haben. Bei Deinem Code ist das: Bau mir ein neues Haus und dann schmeiss es direkt weg.

Dann ist das "new House()" einfach ein erzeugen eines neuen Hauses. Da sind erst einmal keine Aktionen inbegriffen wie: Ich gehe in die Küche und koche eine Gulasch. Klar, das kann man technisch machen. Aber wenn ich jemandem sage "Ich baue mir ein Haus", dann erwartet niemand in dieser Aussage, dass ich einen Topf Gulasch koche. ==> Jemand der den Code sieht, will ja wissen, was in dem Code passiert. Und das sieht man in dem Code nicht, weil Du Aktionen in dem Construktor zu verstecken scheinst.

Also konkretes Beispiel wäre z.B. ein JFrame. "new JFrame()" erzeugt ein JFrame Objekt. Aber damit wird noch nichts gemacht. Das wird noch nicht angezeigt oder so. Keine versteckten Aktionen sind im "new Frame()" enthalten.

Also nur noch einmal zum Verständnis:
Klassen sind vergleichbar mit Bauplänen. Mit den Bauplänen erzeugst Du Objekte und diese nutzt Du. Also Du nutzt den Bauplan Notizblock um einen Notizblock zu erzeugen. Und en erzeugten Notizblock nutzt Du dann um da was rein zu schreiben. Du fängst doch nicht an, auf dem Bauplan rum zu kritzeln!

Dann weiter zum Verständnis: Deine Klasse Var hat nur einen Inhalt: eine statische Variable. Es macht also keinen Sinn, davon eine neue Instanz zu erzeugen. ein "new Var()" ist also einfach sinnlos. Das ist so etwas wie: Hier ist ein leerer Bauplan - auf dem habe ich zwar etwas notiert, aber sonst ist er einfach leer. Nun bau mir bitte nach diesem Bauplan ein neues Objekt ....
(Und da Du eine Instanzen davon erzeugst, ist - wie schon erwähnt wurde - das Serializable Sinnlos. Du willst sozusagen, dass die Objekte, die vom leeren Bauplan erzeugt werden, auch mit der Post versendet werden können.)

Ein Punkt, der auch wichtig ist, weil es ein mögliches Problem sein könnte:
In Java gibt es einen Müllmann (Garbage Collector). Der geht regelmäßig alles durch und sucht nach Objekten, die niemand mehr in der Hand hält. Und die zerstört er einfach.
Wenn Du also ein Objekt erzeugst, dann solltest Du es immer "in der Hand" behalten. Das bedeutet unter dem Strich, dass ein Thread auf dieses Objekt zugreifen können muss. Das muss nicht direkt sein - das geht auch über Umwegen. Also wenn ein Thread ein Objekt kennt, dass das fragliche Objekt kennt dann ist das auch ok.
Und dann das Problem mit dem BufferedStream:
Du willst etwas wegbringen. Aber damit Du nicht für jedes Paket extra zur Post rennen musst, hast Du eine Kiste, und in die wirfst Du alle Pakete. Und hin und wieder bringst du dann alle Pakete aus der Kiste zur Post. Nun mit dem, was ich davor geschrieben haben: Du wirfst es in die Kiste, aber dann interessiert dich die Kiste nicht mehr. Dann kommt der Müllmann und wirft die Kiste mit allen Paketen in den Müll - und dann kommen die Pakete nie zur Post.

Konkret bedeutet dies:
Java:
public static void writeHighscoreToFile () throws IOException
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("SpielDaten.bin"));
        oos.write(Var.Highscore);
    }

Du erzeugst eine Variable oos und rufst write auf. Danach ist die Methode zu Ende und damit die Instanz in oos vergessen und wird ein Fall für den Müllmann (Garbage Collector). So das, was Du geschrieben hast mit write noch nicht auf die Platte geschrieben hast, bedeutet dies, dass es weg ist.

Die Lösung ist hier einfach und eines der Grundprizipien von Java: Es gibt ein Interface AutoClosable, welches von Streams implementiert wird. Und die einfache Regel wurde schon genannt: Wenn ein Objekt AutoClosable implementiert, dann sollte man dieses schließen. Java hat dafür sogar extra ein Konstrukt: Try with ressources. Damit sähe der Code dann so aus:
Java:
public static void writeHighscoreToFile () {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("SpielDaten.bin"))) {
            oos.write(Var.Highscore);
        } catch (IOException ex) {
            System.err.println("Couldn't write highscore: " + ex.getMessage());
            ep.printStackTrace();
        }
    }

Nebenbei noch ein paar Dinge mehr eingebaut:
- Java Coding Style: { gehört in die gleiche Zeile.
- das throws habe ich raus genommen. Gibt doch keinen Grund, das weiter zu reichen ....
- Wenn exception, dann immer alles Ausgeben. Also mindestens die Message und den StackTrace! Eine einfache Aussage wie "Da ist was schief gelaufen" hilft nicht wirklich weiter...
- Und natürlich das try with ressources

e) Meine Empfehlung
Geh ein Lehrbuch durch. Java ist auch eine Insel ist frei und nicht schlecht. Evtl. gibt es auch auf YouTube vernünftige Java Kurse, aber ich hoffe, ich konnte darlegen, was schief läuft.

Und wenn Du gewisse Hinweise nicht verstehst (ist nichts schlimmes), zeigt doch, dass gewisse Grundlagen eben nicht behandelt wurden in dem Tutorial. Und dass wichtige Grundlagen fehlen. Daher die Empfehlung: Schau Dir z.B. das genannte Buch an! So lange Posts wie diesen sind in meinen Augen Unsinn, denn auch ich mache den Fehler, dass ich versuche komplexe Sachverhalte in viel zu kurzer Weise zu erläutern. Und das mal eben so. Dabei gibt es das alles in vernünftiger Form gut überdacht frei Verfügbar im Netz: http://openbook.rheinwerk-verlag.de/javainsel9/index.htm
Ich hoffe du verstehst nun auch unser Problem mit Deiner Fragestellung: die kurzen, knappen und prägnanten Antworten sind teilweise nicht möglich und die Ansätze haben große Verständnisprobleme.

Du musst meinen Vorschlag auch nicht wahrnehmen. Du kannst gerne auf Discord mit denen reden, die dieses Tutorial toll finden und dieses Vorgehen tatsächlich supporten wollen. Aber zumindest mein Anspruch ist dies nicht. Ich helfe gerne, aber da muss es auch etwas Sinn machen.
 
K

kneitzel

Gast
Jetzt wo sie sogar in spanische übersetzt werden macht das doch schon doppelt Sinn
Hmm ... dann ist das bald wie bei Autoren, die damit werben, dass Ihre Bücher in zig Sprachen übersetzt wurden ...

Meine Forenposts sind so gut - die werden sogar in mehrere Sprachen übersetzt :)

Aber andererseits kann das ein anderes Projekt meiner Entwickler sein - so wie ich nur ein Foren-Bot bin, ist das evtl. mein Bruder: Der Forenübersetzer?

Ist das etwa ein Kritikunfähigkeitseingeständnis? :)
Das kann ich nicht nachvollziehen. Kritik an mir ist nun wirklich trivial und einfach; Es muss nur ein Ticket im Ticketsystem / Bugtracker erstellt werden und meine Entwickler werden dies Sichten, Bewerten und dann ggf. - so es Sinn macht - in einem der nächsten Sprints mit berücksichtigen....
 
K

kneitzel

Gast
Willst Du in die Politik? Kritikunfähigkeitseingeständnisdurchführungsverordnung. Obwohl: heute heißt das ja das Gute-Kritik-Gesetz.
Die Kritikunfähigkeitseingeständnisdurchführungsverordnung ist doch abgelehnt worden, denn es gab doch die Antikritikunfähigkeitseingeständnisdurchführungsverordnungvereinigung mit ihren täglichen Antikritikunfähigkeitseingeständnisdurchführungsverordnungvereinigungtreffen, welche sogar im Internet in Antikritikunfähigkeitseingeständnisdurchführungsverordnungvereinigungtreffenstreams online verfolgt werden konnten... Wenn Du die aber nicht mitbekommen hast, dann gebe ich Dir später noch den Link zu den Antikritikunfähigkeitseingeständnisdurchführungsverordnungvereinigungtreffenstreamprotokollen.... Aber im Augenblick gibt mit Google keinen Treffer ... aber evtl. finde ich ja noch eine Antikritikunfähigkeitseingeständnisdurchführungsverordnungvereinigungtreffenstreamprotokollsuchmaschine ...

Die Deutsche Sprache mit der Möglichkeit, neue Worte so zu bilden, ist schon schön :)
 

DerSophist

Mitglied
Sicher, dass dir Variable nirgendwo benutzt wird? Wenn du den Highscore nirgendwo benutzt ist klar, warum du nicht siehst, dass er gespeichert wurde...



Das Einlesen wird schon ausgeführt (wenn auch auf denkbar schlechteste Weise), das kannst du im Zweifel auch einfach mit einem System.out.print testen.
Also mal einfach von Anfang an:

a) Kritik an dem Tutorial solltest Du nicht auf Dich beziehen.

b) Was an dem Tutorial schlecht ist: Java ist eine Objektorientierte Sprache. Daher sollte man verstehen, was eben Objekte sind. Und dazu gehört, das man dann auch z.B massiv auf das Schlüsselwort "static" verzichtet. Anfängern hier im Forum empfehlen wir oft, auf dieses Schlüsselwort komplett (bis auf das "static void main") zu verzichten. Denn das verhindert nach meiner Erfahrung massiv die Erlernung einer Objektorientierten Sprache.

c) Dein Code - mögliche Fehler.
c1) Eine Vermutung ist, dass Du in der Logik etwas falsch machst. Evtl. stimmt die Reihenfolge von Aufrufen nicht oder etwas, das Du gerne aufrufen möchtest, wird nicht aufgerufen. Hier bietet sich die Nutzung eines Debuggers an. Oder wenn Dir das noch zu kompliziert ist: Bau mehr Ausgaben ein.
c2) Die Vermutung, die auch geäußert wurde, ist, dass Du die Daten in einen Stream schreibst. Dieser puffert die Daten zwischen (und schreibt diese nicht sofort) und dann kommt der Garbage Collector und zerstört das Objekt, ehe die Daten geschrieben werden konnten.

d) Dein Code - was daran unschön ist (und damit eine direkte Kritik an dem Tutorial ist!)

Nehmen wir uns nur einmal die main Methode um zu sehen, was die Applikation macht:
Java:
    public static void main(String[] args) throws IOException {
   // write your code here
        new Gui(); //die Gui wird erstellt, wenn das Programm startet
        new Var(); //die Var wird erstellt, wenn das Programm startet
        new Label(); //das Label wird erstellt, wenn das Programm startet
        new KeyHandler(); //der KeyHandler wird erstellt, wenn das Programm startet
        new Background(); //das Background-Verhalten wird erstellt, wenn das Programm startet
        new PlayerMovement();
        new FlammenAnimation();
        new GegnerMovement();
        new SchrottMovement();
        new GegnerKollision();
        new SchrottKollision();
        new Explosion();
        new ActionHandler();
        new SpeicherVorgang();
    }
Du erstellst eine ganze Reihe an Instanzen, aber keine Instanz scheint Dich wirklich zu interessieren, denn die erstellten Instanzen speicherst Du nicht.
Was mich daran massiv stört ist:
Das Erstellen einer neuen Instanz soll nur eine neue Instanz erzeugen. Wenn ich sage: Ich habe hier einen Bauplan von einem Haus, das Haus baue ich mir. Dann wird lediglich das Haus gebaut. Und danach möchte ich das erzeugte Haus haben. Bei Deinem Code ist das: Bau mir ein neues Haus und dann schmeiss es direkt weg.

Dann ist das "new House()" einfach ein erzeugen eines neuen Hauses. Da sind erst einmal keine Aktionen inbegriffen wie: Ich gehe in die Küche und koche eine Gulasch. Klar, das kann man technisch machen. Aber wenn ich jemandem sage "Ich baue mir ein Haus", dann erwartet niemand in dieser Aussage, dass ich einen Topf Gulasch koche. ==> Jemand der den Code sieht, will ja wissen, was in dem Code passiert. Und das sieht man in dem Code nicht, weil Du Aktionen in dem Construktor zu verstecken scheinst.

Also konkretes Beispiel wäre z.B. ein JFrame. "new JFrame()" erzeugt ein JFrame Objekt. Aber damit wird noch nichts gemacht. Das wird noch nicht angezeigt oder so. Keine versteckten Aktionen sind im "new Frame()" enthalten.

Also nur noch einmal zum Verständnis:
Klassen sind vergleichbar mit Bauplänen. Mit den Bauplänen erzeugst Du Objekte und diese nutzt Du. Also Du nutzt den Bauplan Notizblock um einen Notizblock zu erzeugen. Und en erzeugten Notizblock nutzt Du dann um da was rein zu schreiben. Du fängst doch nicht an, auf dem Bauplan rum zu kritzeln!

Dann weiter zum Verständnis: Deine Klasse Var hat nur einen Inhalt: eine statische Variable. Es macht also keinen Sinn, davon eine neue Instanz zu erzeugen. ein "new Var()" ist also einfach sinnlos. Das ist so etwas wie: Hier ist ein leerer Bauplan - auf dem habe ich zwar etwas notiert, aber sonst ist er einfach leer. Nun bau mir bitte nach diesem Bauplan ein neues Objekt ....
(Und da Du eine Instanzen davon erzeugst, ist - wie schon erwähnt wurde - das Serializable Sinnlos. Du willst sozusagen, dass die Objekte, die vom leeren Bauplan erzeugt werden, auch mit der Post versendet werden können.)

Ein Punkt, der auch wichtig ist, weil es ein mögliches Problem sein könnte:
In Java gibt es einen Müllmann (Garbage Collector). Der geht regelmäßig alles durch und sucht nach Objekten, die niemand mehr in der Hand hält. Und die zerstört er einfach.
Wenn Du also ein Objekt erzeugst, dann solltest Du es immer "in der Hand" behalten. Das bedeutet unter dem Strich, dass ein Thread auf dieses Objekt zugreifen können muss. Das muss nicht direkt sein - das geht auch über Umwegen. Also wenn ein Thread ein Objekt kennt, dass das fragliche Objekt kennt dann ist das auch ok.
Und dann das Problem mit dem BufferedStream:
Du willst etwas wegbringen. Aber damit Du nicht für jedes Paket extra zur Post rennen musst, hast Du eine Kiste, und in die wirfst Du alle Pakete. Und hin und wieder bringst du dann alle Pakete aus der Kiste zur Post. Nun mit dem, was ich davor geschrieben haben: Du wirfst es in die Kiste, aber dann interessiert dich die Kiste nicht mehr. Dann kommt der Müllmann und wirft die Kiste mit allen Paketen in den Müll - und dann kommen die Pakete nie zur Post.

Konkret bedeutet dies:
Java:
public static void writeHighscoreToFile () throws IOException
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("SpielDaten.bin"));
        oos.write(Var.Highscore);
    }

Du erzeugst eine Variable oos und rufst write auf. Danach ist die Methode zu Ende und damit die Instanz in oos vergessen und wird ein Fall für den Müllmann (Garbage Collector). So das, was Du geschrieben hast mit write noch nicht auf die Platte geschrieben hast, bedeutet dies, dass es weg ist.

Die Lösung ist hier einfach und eines der Grundprizipien von Java: Es gibt ein Interface AutoClosable, welches von Streams implementiert wird. Und die einfache Regel wurde schon genannt: Wenn ein Objekt AutoClosable implementiert, dann sollte man dieses schließen. Java hat dafür sogar extra ein Konstrukt: Try with ressources. Damit sähe der Code dann so aus:
Java:
public static void writeHighscoreToFile () {
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("SpielDaten.bin"))) {
            oos.write(Var.Highscore);
        } catch (IOException ex) {
            System.err.println("Couldn't write highscore: " + ex.getMessage());
            ep.printStackTrace();
        }
    }

Nebenbei noch ein paar Dinge mehr eingebaut:
- Java Coding Style: { gehört in die gleiche Zeile.
- das throws habe ich raus genommen. Gibt doch keinen Grund, das weiter zu reichen ....
- Wenn exception, dann immer alles Ausgeben. Also mindestens die Message und den StackTrace! Eine einfache Aussage wie "Da ist was schief gelaufen" hilft nicht wirklich weiter...
- Und natürlich das try with ressources

e) Meine Empfehlung
Geh ein Lehrbuch durch. Java ist auch eine Insel ist frei und nicht schlecht. Evtl. gibt es auch auf YouTube vernünftige Java Kurse, aber ich hoffe, ich konnte darlegen, was schief läuft.

Und wenn Du gewisse Hinweise nicht verstehst (ist nichts schlimmes), zeigt doch, dass gewisse Grundlagen eben nicht behandelt wurden in dem Tutorial. Und dass wichtige Grundlagen fehlen. Daher die Empfehlung: Schau Dir z.B. das genannte Buch an! So lange Posts wie diesen sind in meinen Augen Unsinn, denn auch ich mache den Fehler, dass ich versuche komplexe Sachverhalte in viel zu kurzer Weise zu erläutern. Und das mal eben so. Dabei gibt es das alles in vernünftiger Form gut überdacht frei Verfügbar im Netz: http://openbook.rheinwerk-verlag.de/javainsel9/index.htm
Ich hoffe du verstehst nun auch unser Problem mit Deiner Fragestellung: die kurzen, knappen und prägnanten Antworten sind teilweise nicht möglich und die Ansätze haben große Verständnisprobleme.

Du musst meinen Vorschlag auch nicht wahrnehmen. Du kannst gerne auf Discord mit denen reden, die dieses Tutorial toll finden und dieses Vorgehen tatsächlich supporten wollen. Aber zumindest mein Anspruch ist dies nicht. Ich helfe gerne, aber da muss es auch etwas Sinn machen.
Ok, das hilft mir weiter. (Nur zu dem Punkt mit dem Java-Coding Style: Im Schulunterricht behandeln wir zurzeit Java und unser Lehrer hat es uns so beigebracht, dass wir die geschweifte Klammer immer unter den Methodenrumpf schreiben. Also denke ich mal, dass man beides machen kann, oder nicht?)
Und übrigens, ich habe mein Problem gelöst, der Fehler lag woanders... Tut mir Leid wenn ich eure Zeit verschwendet habe...
 
Zuletzt bearbeitet von einem Moderator:

mihe7

Top Contributor
(Nur zu dem Punkt mit dem Java-Coding Style: Im Schulunterricht behandeln wir zurzeit Java und unser Lehrer hat es uns so beigebracht, dass wir die geschweifte Klammer immer unter den Methodenrumpf schreiben. Also denke ich mal, dass man beides machen kann, oder nicht?)
Ja, kann man machen (und im Schulunterricht kann es durchaus Gründe geben, warum ihr das so machen sollt), entspricht aber nicht den Konventionen. Das ist aber nicht so dramatisch, wie die Nichteinhaltung der Benennungskonventionen, da jede IDE die Formatierung des Quellcodes anbietet.
 
K

kneitzel

Gast
Ok, das hilft mir weiter. (Nur zu dem Punkt mit dem Java-Coding Style: Im Schulunterricht behandeln wir zurzeit Java und unser Lehrer hat es uns so beigebracht, dass wir die geschweifte Klammer immer unter den Methodenrumpf schreiben. Also denke ich mal, dass man beides machen kann, oder nicht?)
Und übrigens, ich habe mein Problem gelöst, der Fehler lag woanders... Tut mir Leid wenn ich eure Zeit verschwendet habe...

Also dazu nur kurz von meiner Seite: Der Punkt mit dem Coding Style ist nur mit rein gekommen, da ich halt Änderungen, die ich gemacht habe, so mit dokumentiert habe. Wenn für Dich in der Schule ein anderer Styling Guide gilt, solltest Du Dich auf jeden Fall an diesen halten.

Und wir sind ja hier, um zu helfen, auch wenn die Du vielleicht die Hilfe nicht immer so hilfreich fandest. Wäre es Zeitverschwendung in unseren Augen, dann würden wir hier nicht aktiv sein. Du bist also durchaus willkommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Problem mit Serialisierung von jTable Java Basics - Anfänger-Themen 15
W Problem mit Serialisierung und TableModel Java Basics - Anfänger-Themen 3
DStrohma Problem mit Serialisierung Java Basics - Anfänger-Themen 3
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4
M Problem bei Ausgabe Java Basics - Anfänger-Themen 7
Splayfer Java Array Problem... Java Basics - Anfänger-Themen 2
G Problem bei der Ausgabe einer Main Claase Java Basics - Anfänger-Themen 7
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
G Subset sum problem mit Backtracking Java Basics - Anfänger-Themen 18
N Problem mit Scanner Java Basics - Anfänger-Themen 2
J Klassen Problem Java Basics - Anfänger-Themen 8
A Out.format problem. Java Basics - Anfänger-Themen 3
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
A Array problem Java Basics - Anfänger-Themen 16
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Ich habe ein Problem Java Basics - Anfänger-Themen 3
A Problem bei returnen eines Wertes Java Basics - Anfänger-Themen 6
M Regex Erstellung Problem Java Basics - Anfänger-Themen 2
D Input/Output Problem bei der Benutzereingabe eines Befehls Java Basics - Anfänger-Themen 14
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
C Regex-Problem Java Basics - Anfänger-Themen 4
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
W Wo ist das URL-Problem ? Java Basics - Anfänger-Themen 1
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
D FileWriter / FileReader Problem Java Basics - Anfänger-Themen 10
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
S Collections funktionale Listen (ListNode<E>) review und problem beim clone Java Basics - Anfänger-Themen 0
W OOP Vererbung und Problem bei Zählschleife in einer Methode Java Basics - Anfänger-Themen 10
C Problem mit If Else If und Überprüfung eines Counters Java Basics - Anfänger-Themen 3
F Problem mit Listen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben