2016-03-29 11 views
0

Ich versuche gerade, ein aktualisierendes Scoreboard zu machen, das einen Spieler HP und aktuelle Tötungen verfolgt, aber ich habe nicht viel Glück. Ich habe viele verschiedene Dinge ausprobiert und bin seit gut 2 Stunden festgefahren. Das Problem liegt beim Versuch, die Spieler HP zu holen und zu töten. Der folgende Fehler ist der des Tötungs-Problems, aber ein anderes Problem ist, dass HP null zurückgibt, daher die Unbehandelte Ausnahme. Hier gibt es Fehler:Unbehandelte Ausnahme im neuen Plugin-Code, die ich nicht herausfinden kann. Null [Minecraft Java]

enter image description here

Hier ist der Code: Linie 144-162 von Main.java

@SuppressWarnings("deprecation") 
public void run(String arena){ 
    for(String key : Handler.playerMap.keySet()){ 
     if (Handler.playerMap.get(key).contains(arena)){ 
      Player pt = Bukkit.getPlayer(key); 
      String p = pt.getDisplayName(); 
      ScoreboardManager manager = Bukkit.getScoreboardManager(); 
      Scoreboard board = manager.getNewScoreboard(); 
      Objective objective = board.registerNewObjective("test", "dummy"); 
      objective.setDisplaySlot(DisplaySlot.SIDEBAR); 
      objective.setDisplayName(ChatColor.AQUA + "Wave: "); 
      Score score = objective.getScore(ChatColor.GREEN + "" + pt.getHealth() + ChatColor.WHITE + p + ChatColor.AQUA); 
      int kills = PlayerHandler.kills.get(p); 
      score.setScore(kills); 
      int pcheck = 0; 

Kann jemand mir sagen, was das Problem ist? Vielen Dank im Voraus für Kommentare.

+1

möglich, dass PlayerHandler.kills null ist – Rustam

Antwort

0

Wie Sie betont haben, dies geschieht, wenn die PlayerHandler.kills gibt null zurück, oder wenn der Spieler bekommen HP null zurück. Der Grund dafür ist, dass Sie versuchen, eine Methode für ein Null-Objekt auszuführen. Wenn Sie im obigen Beispiel versuchen, get(p) für ein Null-Objekt zu verwenden, erhalten Sie diese Ausnahme.

Sie können NullPointerExceptions vermeiden, indem Ungültigkeit prüft das Hinzufügen, um sicherzustellen, dass das Objekt nicht null ist, ein Verfahren auf sie vor dem Aufruf. Zum Beispiel würden prüfen, die unten, ob es kills ist, und wenn nicht die Partitur auf Null gesetzt:

int kills = 0; 
if (PlayerHandler.kills != null) { 
    kills = PlayerHandler.kills.get(p); 
} 
score.setScore(kills); 

Sie müssen etwas ähnliches tun, die Situation zu vermeiden, wo die PS null ist.

Werfen Sie einen Blick auf this article über Null-Zeiger und wie man sie für weitere Details zu vermeiden.

0

Haftungsausschluss: was ich noch keine Erfahrung in Mine Plugin-Entwicklung haben. Aber ich habe etwas Erfahrung in Minecraft Mod Entwicklung.

ich glaube, das Problem ist, dass kein Spieler jemand getötet hat. Der Ausnahme-Stack-Trace sagt, dass die Ausnahme auf der Leitung aufgetreten 160:

int kills = PlayerHandler.kills.get(p); 

A NullPointerException zeigt an, dass etwas null ist. In der Zeile können nur PlayerHandler.kills und p null sein. Allerdings ist tatsächlich der Anzeigename des Players und ich glaube nicht, dass Spieler null als Anzeigenamen haben können. Also die Möglichkeit, dass p == null beseitigt ist.

Jetzt kann nur eine Sache null sein - die kills. Ich glaube, dass kills vom Typ HashMap<String, Integer> ist. Nach meinem gesunden Menschenverstand ist dies eine Karte, die alle Spielernamen als Schlüssel und die Anzahl der Kills enthält, die der Spieler als Werte hat.

Warum ist die Hash-Map also null? Vielleicht hat noch niemand getötet. Ich habe mich in Minecraft mit Anzeigetafeln herumgeschlagen, und ich weiß, dass außer einer Punktzahl von 0 Sie auch "keine Punktzahl" haben können, was meiner Meinung nach in der Quelle als null dargestellt wird.

Viele Möglichkeiten:

Wie dieses Problem zu lösen!

  • Tötet jemand
  • selbst töten durch einen Pfeil oder Trank (wenn Sie immer allein sind)
  • einen Scheck hinzufügen, um zu sehen, ob die Karte leer ist (empfohlen)

Hier ist die überprüfen:

int kills = 0; 
if (PlayerHandler.kills != null) { 
    kills = PlayerHandler.kills.get(p); 
} 
score.setScore(kills); 
+0

Auch wenn 'p' null ist, würden Sie eine' NullPointerException' in dieser Zeile nicht erhalten – tddmonkey

-1

Aber die Daten in PlayerHandler.kills ist nicht null.

Dadurch werden die Spieler tötet beim Beitritt:

@EventHandler 
public void onPlayerLogin(PlayerJoinEvent e) { 

    String player = e.getPlayer().getName(); 
         if(!PlayerHandler.GPlayed.containsKey(player)){ 
          PlayerHandler.GPlayed.put(player, 0); 
         } 
         if(!PlayerHandler.kills.containsKey(player)){ 
          PlayerHandler.kills.put(player, 0); 
         } 
         if(!PlayerHandler.HRound.containsKey(player)){ 
          PlayerHandler.HRound.put(player, 0); 
         } 

} 

Und hier ist ein Debug Ich habe versucht, zu schaffen, sondern der gleiche Fehler versuchte noch mit den entsprechenden Kontrollen alle richtig sind.

@SuppressWarnings("deprecation") 
public void run(String arena){ 
    for(String key : Handler.playerMap.keySet()){ 
     if (Handler.playerMap.get(key).contains(arena)){ 
      Player pt = Bukkit.getPlayer("Nubzz"); 
      String p = pt.getDisplayName(); 
      Player nubzz = Bukkit.getPlayer("Nubzz"); 
      nubzz.sendMessage(key); 
      nubzz.sendMessage(pt + ""); 
      nubzz.sendMessage(p); 
      ScoreboardManager manager = Bukkit.getScoreboardManager(); 
      Scoreboard board = manager.getNewScoreboard(); 
      Objective objective = board.registerNewObjective("test", "dummy"); 
      objective.setDisplaySlot(DisplaySlot.SIDEBAR); 
      objective.setDisplayName(ChatColor.AQUA + "Wave: "); 
      Score score = objective.getScore(ChatColor.GREEN + "" + pt.getHealth() + ChatColor.WHITE + p + ChatColor.AQUA); 
      int kills = PlayerHandler.kills.get(p); 
      score.setScore(kills); 
      int pcheck = 0; 

Dies zeigt die Debug-Funktion und die Spieler zeigen, hat kills (Vielleicht bin ich die falschen Variablen Werte Prüfung): https://gyazo.com/35a83b11a1fb384789a15ae54116248d

0

Unter der Annahme, dass alle statischen Variablen noch die Zeile korrekt int kills = PlayerHandler.kills.get(p); initialisiert werden können verursacht eine Nullpointer

Dies liegt daran, versuchen null zu einer primitiven variablen zugewiesen wird ein NullPointerException

werfen
Verwandte Themen