Discord

  • Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Problem bei Objektorientierung in Minecraft

CubBossa

Redstoneengineer
Mitglied seit
17 Juli 2015
Beiträge
42
Minecraft
CubBossa
Hallo liebes Forum. Ich übe mich gerade ein wenig im Programmieren mit Minecraft und habe versucht, eine Klasse, mit der ich einzelne Spielerfiles bearbeite, zu programmieren. Das ganz Objektorientiert, was ja eigentlich gut sein sollte oder? Nur bleibt ein eigenartiger Bug den ich nicht allzuleicht erklären kann.
Ich habe das SpielerFile Objekt so programmiert:

Javascript:
public class SpielerFile {

    //Variablen
   
    private Player p = null;
    private File file = null;
    private YamlConfiguration cfg = null;
   
    public static HashMap<Player, Boolean> tutAbsolved = new HashMap<Player, Boolean>();
   
    //Konstruktoren
   
    public SpielerFile(Player p) {
       
        this.p = p;
        this.file = new File("plugins/Athernon/Players", ""+p.getUniqueId()+".yml");
        this.cfg = YamlConfiguration.loadConfiguration(file);
    }
   
    public void setSpieler(Player p) {
        this.p = p;
        this.file = new File("plugins/Athernon/Players", ""+p.getUniqueId()+".yml");
        this.cfg = YamlConfiguration.loadConfiguration(file);
    }
    //Methoden
   
    /**
     * Erstellt ein Spielerfile wenn der Spieler noch keines besitzt
     */
    public void createFile(OfflinePlayer p) {
       
        if(!file.exists()) {
            cfg.set("Name", p.getName());
            try {
                cfg.save(file);
            } catch (Exception ex) {}
        }
    }
   
    public Object get(String pfad) {
       
        if(file.exists()) {
            return cfg.get(pfad);
        } else {
            createFile(p);
            return null;
        }
    }
}
So. Jetzt möchte ich in anderen Klassen, ebenfalls objektorientiert Einträge in das Spielerfile machen. Ich habe in dem File noch ein paar andere Methoden die ich jetzt mal nicht alle aufgeschrieben habe, da es glaube ich nicht an ihnen liegt. Durch rumprobieren habe ich nämlich festgestellt dass folgendes nicht funktioniert:


Javascript:
public class Ausdauer {
   
    //Variablen
   
    private Player p;
    private KlassenTools kt;
    private int TaskID = -1;
    private double ausdauer = 0;
    private Ausdauer ad = this;
    private SpielerFile pf;
   
    //Konstruktoren
   
    public Ausdauer(Player p) {
        this.p = p;
        this.kt = new KlassenTools(p);
        this.ausdauer = this.getAusdauerMax();
        this.pf = new SpielerFile(p);
    }
   
    public Ausdauer(Player p, double ausdauer, int TaskID) {
        this.p = p;
        this.kt = new KlassenTools(p);
        this.ausdauer = ausdauer;
        this.TaskID = TaskID;
        this.pf = new SpielerFile(p);
       
    }
   
    //Methoden
   
    public double getAusdauer() {
        return ausdauer;
    }
   
    public double getAusdauerMax() {
       
        return 30 + 100 *
                kt.getLevel() /
                kt.getMaxLevel(
                        pf.getString("Rasse.Name"));
    }
}
Um genauzusein gibt es eine Nullpointer Exception, die auf die Zeile 50, aka "pf.getString("Rasse.Name"));" verweist. Wenn ich also testweise in der methode getAusdauerMax() einmal ein File erstelle wie in der Klasse PlayerFiles, dann gibt es keine Fehlermeldungen mehr. Ich habe zum test auch schonmal im Konstruktor vom SpielerFiles nen Broadcast getippt aber der wurde ausgeführt. Also eigentlich müsste alles klappen

Ich hoffe sehr, mir kann jemand helfen,
Mfg CubBossa
 

UnityGaming

Workaholic
Mitglied seit
25 Oktober 2015
Beiträge
516
Alter
20
Minecraft
FastFelix771
Wenn die Datei noch nicht vorhanden ist, bzw. der Eintrag "Rasse.Name" fehlt, dann kriegst du dementsprechend auch null, also nichts, zurück oder es wird sogar eine Exception geworfen, je nachdem wie du das abfängst.

Bevor du diese Werte versuchst zu verwenden solltest du sicherstellen, dass die Dateien erstellt wurden und z.B. Standardwerte gesetzt wurden, damit dir sowas idR. nicht mehr passiert während der Laufzeit.

Alternativ kannst du auch defensiv coden und bei der Abfrage einen null-check einbauen und dementsprechend einen "fallback" Wert einsetzen.
 

BlackHole

Workaholic
Mitglied seit
1 Juli 2012
Beiträge
749
Minecraft
BlackHole
Statt solcher Config-Dateien würde ich GSON verwenden. Damit ist es viel leichter, Objektbäume aus oder in JSON-Dateien zu bekommen.

Die Klasse Plugin bietet eine Methode getDataFolder(), die den Ordner des Plugins zurückgibt.

Die Map tutAbsolved sollte als Schlüssel nicht Player verwenden, sondern z.B. die UUID der Spieler. Spielerobjekte halten Referenzen zu vielen anderen Objekten, die dann nicht freigegeben werden können und somit ein Speicherleck erzeugen.
 

CubBossa

Redstoneengineer
Mitglied seit
17 Juli 2015
Beiträge
42
Minecraft
CubBossa
Vielen dank für die Antworten. UnityGaming, das habe ich auch schon versucht. Ich habe testweise auch einfach mal sofort als rückgabewert den String "Default" festgelegt und gar nicht mehr auf irgendein File zugegriffen und es entstand das selbe problem. Aber danke für den Hinweis :)

BlackHole ich werde mich mal reinlesen, dankeschön. Das mit der map ist auch gut zu wissen, das werde ich dann auch gleich mal bei meinen anderen maps ändern.
 
Oben