• 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!

Spigot Erledigt PlugIn Nullpointer Exception bei aufrufen einer HashMap

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Ich habe folgenden Code, in dem ich den Wechsel eines Spielers zu einer anderen Region überprüfen will:
Java:
HashMap<String, String> lastReg = new HashMap<>();

    @EventHandler
    public void onMove(PlayerMoveEvent e) {
       
        if(lastReg.get(e.getPlayer().getName()) != API.getRegionName(e.getPlayer().getLocation())
                || !lastReg.containsKey(e.getPlayer().getName())) {
           
            e.getPlayer().setScoreboard(SB.getSB(e.getPlayer().getName()));
            lastReg.put(e.getPlayer().getName(), API.getRegionName(e.getPlayer().getLocation()));
        }
    }
Die API.getRegionName-Methode funktioniert einwandfrei und gibt immer den Namen der Aktuellen Region als String zurück.
Der Server jedoch gibt mir direkt bei der ersten abfrage im EventHandler eine NullpointerException aus. Habt ihr vielleicht eine
Idee warum ?

Vielen Dank für eure Hilfe!
 
Zuletzt bearbeitet:

Avankziar

Kuhfänger
Osterei Experte
Mitglied seit
12 Februar 2018
Beiträge
83
Alter
26
Minecraft
Avankziar
Vielleicht wäre es besser anstatt
Code:
if(lastReg.get(e.getPlayer().getName())== null)
{
    e.getPlayer().sendMessage("Test");
}

if(!lastReg.contains(e.getPlayer().getName()))
{
    e.getPlayer().sendMessage("Test");
}
 

JOO200

Vorarbeiter
Osterei Experte
Mitglied seit
18 Dezember 2016
Beiträge
254
Deine Abfrage ist "falschrum". Du solltest zuerst schauen, ob der Name in der Liste enthalten ist. Danach solltest du schauen, in welcher Region der Spieler ist.
Das Problem ist, dass aktuell erst der Vergleich gemacht wird.

Außerdem vermisse ich hier den Vergleich von Strings mit der .equals Funktion (wie sie auch bei .containsKey()) benutzt wird. Solange du nicht weißt, was du machst, solltest du (außer bei primitiven Datentypen) niemals das (Un-)Gleich-Zeichen einsetzen.
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Vielleicht wäre es besser anstatt
Code:
if(lastReg.get(e.getPlayer().getName())== null)
{
    e.getPlayer().sendMessage("Test");
}

if(!lastReg.contains(e.getPlayer().getName()))
{
    e.getPlayer().sendMessage("Test");
}
In der Relevanten abfrage habe ich dies ja auch so gemacht.
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Deine Abfrage ist "falschrum". Du solltest zuerst schauen, ob der Name in der Liste enthalten ist. Danach solltest du schauen, in welcher Region der Spieler ist.
Das Problem ist, dass aktuell erst der Vergleich gemacht wird.

Außerdem vermisse ich hier den Vergleich von Strings mit der .equals Funktion (wie sie auch bei .containsKey()) benutzt wird. Solange du nicht weißt, was du machst, solltest du (außer bei primitiven Datentypen) niemals das (Un-)Gleich-Zeichen einsetzen.
Ich habe nun folgenden Code:
Java:
    @EventHandler
    public void onMove(PlayerMoveEvent e) {
        
        if(!Data.lastReg.containsKey(e.getPlayer().getName())
                || !Data.lastReg.get(e.getPlayer().getName()).equals(API.getRegionName(e.getPlayer().getLocation())) ) {
            
            e.getPlayer().setScoreboard(SB.getSB(e.getPlayer().getName()));
            Data.lastReg.put(e.getPlayer().getName(), API.getRegionName(e.getPlayer().getLocation()));
        }
    }
Leider gibt es immernoch genau den selben Fehler :(
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Ok hier der Fehler:

Fehler:
[16:01:55] [Server thread/ERROR]: Could not pass event PlayerMoveEvent to RegionPL v1.1
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:529) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:514) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PlayerConnection.a(PlayerConnection.java:986) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PacketPlayInFlying.a(SourceFile:126) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PacketPlayInFlying$PacketPlayInPosition.a(SourceFile:57) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.TickTask.run(SourceFile:18) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.executeTask(SourceFile:144) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.executeNext(SourceFile:118) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.aX(MinecraftServer.java:910) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.executeNext(MinecraftServer.java:903) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.awaitTasks(SourceFile:127) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.sleepForTick(MinecraftServer.java:887) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:820) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
Caused by: java.lang.NullPointerException
        at listener.AllListener.onMove(AllListener.java:51) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_211]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_211]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:316) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        ... 17 more
Die Zeile 51 enthält folgenden Code:
Java:
if(!Data.lastReg.containsKey(e.getPlayer().getName())
Damit mit es nicht zur Verwirrung kommt: Ich habe die Hashmap in eine Klasse namens "Data" verlegt. Dies ist der Grund für das neu hinzugekommene "Data." vor "lastReg".
 
Zuletzt bearbeitet:

Antricks

Minecrafter
Mitglied seit
21 September 2019
Beiträge
2
Ok hier der Fehler:

Fehler:
[16:01:55] [Server thread/ERROR]: Could not pass event PlayerMoveEvent to RegionPL v1.1
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:529) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:514) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PlayerConnection.a(PlayerConnection.java:986) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PacketPlayInFlying.a(SourceFile:126) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PacketPlayInFlying$PacketPlayInPosition.a(SourceFile:57) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.TickTask.run(SourceFile:18) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.executeTask(SourceFile:144) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.executeNext(SourceFile:118) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.aX(MinecraftServer.java:910) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.executeNext(MinecraftServer.java:903) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.awaitTasks(SourceFile:127) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.sleepForTick(MinecraftServer.java:887) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:820) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
Caused by: java.lang.NullPointerException
        at listener.AllListener.onMove(AllListener.java:51) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_211]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_211]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:316) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        ... 17 more
Die Zeile 51 enthält folgenden Code:
Java:
if(!Data.lastReg.containsKey(e.getPlayer().getName())
Damit mit es nicht zur Verwirrung kommt: Ich habe die Hashmap in eine Klasse namens "Data" verlegt. Dies ist der Grund für das neu hinzugekommene "Data." vor "lastReg".
Eine NullPointerException bedeutet, dass du dich auf einen Zeiger beziehst, der jedoch keinen Wert (also null) hat. Guck mal nach, ob du alle Objekte in der Abfrage richtig initialisiest anstatt sie nur leer zu definieren.
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Eine NullPointerException bedeutet, dass du dich auf einen Zeiger beziehst, der jedoch keinen Wert (also null) hat. Guck mal nach, ob du alle Objekte in der Abfrage richtig initialisiest anstatt sie nur leer zu definieren.
Naja, du kannst ja im Code oben sehen, wie ich die HashMap initialisiert habe, und wann ich sie wie befülle.
Ich habe da noch keinen Fehler gefunden.
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
114
Alter
21
Minecraft
LapisMC
@Spyrex
Der Code in deinem ersten Post ist ja aber nicht mehr aktuell, weil du die HashMap verlegt hast. Wenn durch die genannte Zeile eine NullPointerException entsteht, dann kann das die folgenden Gründe haben:
  1. lastReg ist null (= HashMap nicht initialisiert)
  2. e ist null (sollte unmöglich sein) oder getPlayer() gibt null zurück (laut Javadoc ausgeschlossen, ist in CraftBukkit/Spigot auch nicht möglich)
Was steht denn in Data?
 

Antricks

Minecrafter
Mitglied seit
21 September 2019
Beiträge
2
Naja, du kannst ja im Code oben sehen, wie ich die HashMap initialisiert habe, und wann ich sie wie befülle.
Ich habe da noch keinen Fehler gefunden.
Naja wenn man in die Fehlermeldung unter dem Caused by sieht, scheint es vom Listener listener.AllListener.onMove zu kommen. Die Methode onMove wird wohl kaum null sein, also sehe ich da den Grund.
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
@Spyrex
Der Code in deinem ersten Post ist ja aber nicht mehr aktuell, weil du die HashMap verlegt hast. Wenn durch die genannte Zeile eine NullPointerException entsteht, dann kann das die folgenden Gründe haben:
  1. lastReg ist null (= HashMap nicht initialisiert)
  2. e ist null (sollte unmöglich sein) oder getPlayer() gibt null zurück (laut Javadoc ausgeschlossen, ist in CraftBukkit/Spigot auch nicht möglich)
Was steht denn in Data?
Dem war ich mir auch schon bewusst, jedoch hat sich der Fehler von vorher zu dem jetzigen Fehler kein bisschen verändert.

In der Data-Klasse steht
Java:
Public Static HashMap<String, String> lastReg = new HashMap<>();
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
114
Alter
21
Minecraft
LapisMC
Zunächst einmal schreibt man weder public noch static groß. Die Nutzung von static an dieser Stelle ist nicht gerade eine gute Lösung, das ist aber nicht die Fehlerursache. Sofern lastReg nicht irgendwo anders wieder auf null gesetzt wird, sollte es in dieser Zeile kein Fehlerpotenzial geben. Bist du dir sicher, dass es der Aufruf von containsKey() ist, der den Fehler verursacht?
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Ja das mit public und static hab ich auf dem Handy geschrieben das war nicht so aus dem Code kopiert. Mir ist aufgefallen, dass die angeblich fehlerhafte Zeile genau die zeile zwischen dem event und der if abfrage ist. Mir wird also eine leere Zeile als Fehler markiert...
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
114
Alter
21
Minecraft
LapisMC
Dann unterscheidet sich die kompilierte Version auf deinem Testserver wahrscheinlich von dem aktuellen Quelltext. Du solltest das Plugin also noch einmal kompilieren, dann die JAR-Datei auf deinen Testserver übertragen und es erneut versuchen.
 

Spyrex

Kuhfänger
Osterei Experte
Mitglied seit
27 August 2016
Beiträge
85
Minecraft
SpyrexMC
Genau.
Mir ist leider erst viel zu spät aufgefallen, dass ich das Plugin
immer in den falschen Ordner exportiert habe. Nach dem ich dass festgestellt hatte,
und das Plugin richtig exportierte, lief alles einwandfrei...

Das bedeutet, dass jede Version der Codes, die ich gesendet habe, eigentlich
funktioniert hätten, ich jedoch noch eine unvollständige, alte Version auf meinem
Test-Server hatte.

Trotzdem vielen Dank für eure Hilfe ;D
 

Twitter

Allgemein
Hilfe Benutzer
    Matthias Matthias: Guten Morgen
    Oben