• Bitte beachte, dass wir eine Serverliste sind!
    Wenn du ein Problem auf einem Server hast (z.B. Entbannantrag, etc), dann ist das Forum hier der falsche Ort.
  • 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!

Konstruktor wird zweimal aufgerufen

Paarthurnax

Minecrafter
Registriert
23 September 2017
Beiträge
3
Diamanten
0
Hey,

Ich programmiere gerade an einem Plugin, und wie im Titel schon steht habe ich ein Problem.

Ich werde als aller erstes meine Klassen (die wichtigen) hier posten, und danach näher erläutern:

Code:
 public static GeneratorBlock getNewGeneratorBlock(BlockList bl, UUID owner, Location location) {
        switch(bl) {
            case AIR_GENERATOR:
                return new AirGenerator(owner, location, AIR_GENERATOR.getMaterial());
            case WATER_GENERATOR:
                return new WaterGenerator(owner, location, WATER_GENERATOR.getMaterial());
        }
        return null;
    }

Dann wird der folgende Konstruktor aufgerufen:

Code:
public WaterGenerator(UUID owner, Location location, Material material) {
        super(owner, location, material, Constants.WATER_GENERATOR_CAPACITY, 0,20, 10, 20,
                new BlockInformation(location, new String[]{BlockList.WATER_GENERATOR.getBlockItemName(),
                "§5Owner: §e" + Bukkit.getOfflinePlayer(owner).getName(), Constants.ENERGY_FORMAT.replace("{EnergyCount}",
                "0" + Constants.ENERGY_NAME + "/" + Constants.WATER_GENERATOR_CAPACITY + Constants.ENERGY_NAME),
                MessageTranslator.getTranslatedItemMessageLore("water_generator").get(Constants.JSON_DATA_LINE_RUNNING)}));
        this.down = location.clone().subtract(0, 1, 0).getBlock();
    }
PS: Der Konstruktor ist für manche wahrscheinlich etwas "unaufgeräumt" wird aber später geändert.

Der wiederum diesen Konstruktor aufruft:
Code:
public GeneratorBlock(UUID owner, Location location, Material material, double maxEnergyCapacity, double generateEnergyAmount, double energyPerPeriod, double output, int period, BlockInformation blockInformation) {
        super(owner, location, material, period, blockInformation);
        this.maxEnergyCapacity = maxEnergyCapacity;
        this.generateEnergyAmount = generateEnergyAmount;
        this.energyPerPeriod = energyPerPeriod;
        this.output = output;
        this.energyConnections = new ArrayList<>();
    }

Und dieser ruft zu guter letzt den "BaseBlock" Konstruktor auf:
Code:
public BaseBlock(UUID owner, Location location, Material material, int period, BlockInformation blockInformation) {
        this.owner = owner;
        this.location = location;
        this.material = material;
        this.location.getBlock().setType(material);
        this.bukkitBlock = this.location.getBlock();
        this.rightDirection();
        this.blockInformation = blockInformation;
        this.pause = false;
        this.period = period;
        this.id = StaticUtil.getNewId();
        this.bukkitBlock.setMetadata(META_DATA_BLOCK_OWNER, new FixedMetadataValue(MultiMechanicsPlugin.getInstance(), owner));
        this.bukkitBlock.setMetadata(META_DATA_BLOCK_ID, new FixedMetadataValue(MultiMechanicsPlugin.getInstance(), id));
        this.initData();
        this.runnable = new BukkitRunnable() {
            @Override
            public void run() {
                execute();
            }
        };
    }

So, mein Problem ist wie im Titel schon steht, dass der BaseBlock Konstruktor zweimal aufgerufen wird. (Durch Debug Nachrichten heraus gefunden.)
Also: Wenn ich den ersten Block setzte, wird in einer extra File die blockIds um eins erhöht. Alles gut, bis jetzt. Doch dann setze ich den zweiten Block und in der File wird "blockIds" diesmal um zwei erhöht. (Was nicht sein sollte.) Dass, sie um zwei erhöht wird, ist die folge davon dass der "BaseBlock" Konstruktor zweimal aufgerufen wird.

Hier noch die Methode wie ich eine neue ID erzeuge:

Code:
public static int getNewId() {
        if (!ID_FILE.contains("blockIds")) {
            ID_FILE.set("blockIds", 1);
            return 1;
        }
        int id = ID_FILE.get("blockIds", int.class);
        id++;
        ID_FILE.set("blockIds", id);
        return id;
    }

Ich kann mir das irgendwie nicht erklären.
Vielleicht weiß einer von euch woran es liegt und ggf die Lösung.

Sollte noch etwas vom Code her gebraucht werden, einfach schreiben. Werde es dann hinzufügen.

MfG
EncryptDev

EDIT: Sollte es im falschen Unter Forum sein, bitte ich es darum zu verschieben ;)
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
Ich hab persönlich keine Lust den Fehler zu suchen, aber falls du mit einem gut gemeinten Rat auch zufrieden bist: Lern mit dem Debugger deiner IDE umzugehen. Setze einen Breakpoint in dem Konstruktor der unerwartet aufgerufen wird und schau dir dann denn Aufrufstack an. Ich vermute du kannst mit keinem der Begriffe etwas anfangen, daher fang erstmal an den Debugger anzuwenden. Das ist nämlich eine wunderbare Aufgabe, die mit dem richtigen Wissen und einem Debugger in 10 Sekunden gelöst ist und der Debugger ist ein wichtiges Werkzeug.
 

Paarthurnax

Minecrafter
Registriert
23 September 2017
Beiträge
3
Diamanten
0
Habe es nun gefixt.
Der Debugger hat mir zwar nicht geholfen. (Trotzdem Danke für den Vorschlag), aber ich habe heraus gefunden was das Problem war.
Der Block wurde bei dem zweiten setzten, deserialized. (Habe diese Methode aus versehen aufgerufen und übersehen.)
 
Oben