• 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 Nullpointer Exception bei aufrufen einer HashMap

Spyrex

Kuhfänger
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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

Schafhirte
Registriert
12 Februar 2018
Beiträge
135
Alter
33
Diamanten
324
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

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
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
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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
Registriert
21 September 2019
Beiträge
2
Diamanten
300
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
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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.
 

Antricks

Minecrafter
Registriert
21 September 2019
Beiträge
2
Diamanten
300
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
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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<>();
 

Spyrex

Kuhfänger
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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...
 

Spyrex

Kuhfänger
Registriert
27 August 2016
Beiträge
92
Diamanten
300
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
 
Oben