【问题标题】:NullPointerException that stays at the same line no matter what [closed]NullPointerException 无论如何都保持在同一行[关闭]
【发布时间】:2015-03-09 02:58:18
【问题描述】:

我正在尝试编写这个 Minecraft 插件,但我在 CompMeme 类(第 16 行)的 onEnable() 处不断收到 NullPointerException,奇怪的是,即使我将 System.out.print() 放入同一行。如果 NullPointerException 不存在,则意味着插件将简单地加载而没有任何更多消息。如何解决此 NullPointerException?

[21:51:15] [Server thread/ERROR]: Error occurred while enabling CompMeme v0.1.5-SNAPSHOT (Is it up to date?)
java.lang.NullPointerException
    at escaperestart.sircomputer.compmeme.CompMeme.onEnable(CompMeme.java:16) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) ~[spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:335) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at org.bukkit.craftbukkit.v1_8_R1.CraftServer.loadPlugin(CraftServer.java:356) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at org.bukkit.craftbukkit.v1_8_R1.CraftServer.enablePlugins(CraftServer.java:316) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at net.minecraft.server.v1_8_R1.MinecraftServer.q(MinecraftServer.java:402) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at net.minecraft.server.v1_8_R1.MinecraftServer.k(MinecraftServer.java:370) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at net.minecraft.server.v1_8_R1.MinecraftServer.a(MinecraftServer.java:325) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at net.minecraft.server.v1_8_R1.DedicatedServer.init(DedicatedServer.java:211) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:505) [spigot-1.8.jar:git-Spigot-c3c767f-33d5de3]
    at java.lang.Thread.run(Thread.java:744) [?:1.7.0_51

我不确定我做错了什么,这是我的CompMeme 课程:

public final class CompMeme extends JavaPlugin {

    public static CompMeme plugin;
    public String version = "0.1.6-SNAPSHOT";

    public void onEnable() {
        getConfig().options().copyDefaults(true);
        saveConfig();

        getCommand("rofl").setExecutor(Executor.rofl);
        getCommand("facepalm").setExecutor(Executor.facepalm);
        getCommand("lol").setExecutor(Executor.lol);
        getCommand("iliketrains").setExecutor(Executor.iliketrains);
        getCommand("blamenill").setExecutor(Executor.blamenill);
        getCommand("odns").setExecutor(Executor.odns);
        getCommand("ragequit").setExecutor(Executor.ragequit);
        getCommand("rage").setExecutor(Executor.rage);
        getCommand("compmeme").setExecutor(Executor.compmemecmd);
    }

    public void onDisable() {
        saveConfig();
    }
}

这是我的Executor 课程:

public class Executor {
    public static CompMeme compmeme = CompMeme.plugin;

    public static BasicCommand rofl = new BasicCommand(compmeme, "rofl", ChatColor.DARK_GREEN, "[Rofl]");
    public static BasicCommand facepalm = new BasicCommand(compmeme, "facepalm", ChatColor.AQUA, "[Facepalm]");
    public static BasicCommand lol = new BasicCommand(compmeme, "lol", ChatColor.DARK_GREEN, "[Lol]");
    public static BasicCommand iliketrains = new BasicCommand(compmeme, "iliketrains", ChatColor.DARK_PURPLE, "[Trains!]");
    public static BasicCommand blamenill = new BasicCommand(compmeme, "blamenill", ChatColor.DARK_RED, "[Blame Nill]");
    public static InputCommand odns = new InputCommand(compmeme, "odns", ChatColor.GOLD, "[ODNS]");
    public static Rage rage = new Rage(compmeme);
    public static Ragequit ragequit = new Ragequit(compmeme);
    public static CompMemeCmd compmemecmd = new CompMemeCmd(compmeme);
}

这是我的plugin.yml

name: CompMeme
main: escaperestart.sircomputer.compmeme.CompMeme
version: 0.1.5-SNAPSHOT
description: Meme commands for EscapeRestart
author: SirComputer

commands:
  rofl:
   description: Makes you roll on the floor laughing.
   usage: /rofl
   permission: compmeme.rofl

  facepalm:
   description: Makes you facepalm.
   usage: /facepalm
   permission: compmeme.facepalm

   lol:
    description: Makes you laugh out loud.
    usage: /lol
    permission: compmeme.lol

   iliketrains:
    description: Show your support for trains.
    usage: /iliketrains
    permission: compmeme.lol
    aliases: trains

   blamenill:
    description: Makes you blame Nill.
    usage: /blamenill
    permission: compmeme.blamenill

   odns:
    description: One does not simply...
    usage: /odns
    permission: compmeme.odns

   ragequit:
    description: Makes you ragequit.
    usage: /ragequit
    permission: compmeme.ragequit

   rage:
    description: Activate or deactivate rage mode.
    usage: /rage [activate/deactivate]
    permission: compmeme.rage
    aliases: ragemode

   compmeme:
    description: CompMeme information command.
    usage: /compmeme <info/enable/disable>
    permission: compmeme.compmeme
    aliases: ragemode

permissions:
  compmeme.*:
    default: op
    description: Ops get ALL the commands!
    children:
     compmeme.rofl: true
     compmeme.facepalm: true
     compmeme.lol: true
     compmeme.iliketrains: true
     compmeme.blamenill: true
     compmeme.odns: true
     compmeme.ragequit: true
     compmeme.rage: true
     compmeme.compmeme: true
     compmeme.enable: true
     compmeme.disable: true

我不确定其他人是否在 Minecraft 插件中发生过这种情况 - 不过看起来它在其他事情中发生过一两次。

【问题讨论】:

    标签: java eclipse bukkit


    【解决方案1】:

    当您尝试在 null 的对象上运行方法时,将引发 NullPointerException

    你的例外说:

    at escaperestart.sircomputer.compmeme.CompMeme.onEnable(CompMeme.java:16) ~[?:?]
    

    表示CompMeme.java的第16行有一个NullPointerException,也就是这一行:

    getCommand("rofl").setExecutor(Executor.rofl);
    

    实际上问题似乎不是getCommand("rofl"),而是您的plugin.yml,它没有正确缩进。这是我将它粘贴到YAML to JSON parser 时得到的:

    {
      "commands": {
        "facepalm": {
          "blamenill": {
            "usage": "/blamenill", 
            "description": "Makes you blame Nill.", 
            "permission": "compmeme.blamenill"
          }, 
          "description": "Makes you facepalm.", 
          "ragequit": {
            "usage": "/ragequit", 
            "description": "Makes you ragequit.", 
            "permission": "compmeme.ragequit"
          }, 
          "permission": "compmeme.facepalm", 
          "odns": {
            "usage": "/odns", 
            "description": "One does not simply...", 
            "permission": "compmeme.odns"
          }, 
          "rage": {
            "usage": "/rage [activate/deactivate]", 
            "permission": "compmeme.rage", 
            "description": "Activate or deactivate rage mode.", 
            "aliases": "ragemode"
          }, 
          "lol": {
            "usage": "/lol", 
            "description": "Makes you laugh out loud.", 
            "permission": "compmeme.lol"
          }, 
          "iliketrains": {
            "usage": "/iliketrains", 
            "permission": "compmeme.lol", 
            "description": "Show your support for trains.", 
            "aliases": "trains"
          }, 
          "usage": "/facepalm", 
          "compmeme": {
            "usage": "/compmeme <info/enable/disable>", 
            "permission": "compmeme.compmeme", 
            "description": "CompMeme information command.", 
            "aliases": "ragemode"
          }
        }, 
        "rofl": {
          "usage": "/rofl", 
          "description": "Makes you roll on the floor laughing.", 
          "permission": "compmeme.rofl"
        }
      }, 
      "permissions": {
        "compmeme.*": {
          "default": "op", 
          "description": "Ops get ALL the commands!", 
          "children": {
            "compmeme.odns": true, 
            "compmeme.facepalm": true, 
            "compmeme.iliketrains": true, 
            "compmeme.blamenill": true, 
            "compmeme.rofl": true, 
            "compmeme.ragequit": true, 
            "compmeme.rage": true, 
            "compmeme.compmeme": true, 
            "compmeme.disable": true, 
            "compmeme.lol": true, 
            "compmeme.enable": true
          }
        }
      }
    }
    

    如您所见,plugin.yml 中从lolcompmeme 的命令缩进1 个空格太多。要解决此问题,您应该将您的 plugin.yml 更改为:

    commands:
      rofl:
       description: Makes you roll on the floor laughing.
       usage: /rofl
       permission: compmeme.rofl
    
      facepalm:
       description: Makes you facepalm.
       usage: /facepalm
       permission: compmeme.facepalm
    
      lol:
       description: Makes you laugh out loud.
       usage: /lol
       permission: compmeme.lol
    
      iliketrains:
       description: Show your support for trains.
       usage: /iliketrains
       permission: compmeme.lol
       aliases: trains
    
      blamenill:
       description: Makes you blame Nill.
       usage: /blamenill
       permission: compmeme.blamenill
    
      odns:
       description: One does not simply...
       usage: /odns
       permission: compmeme.odns
    
      ragequit:
       description: Makes you ragequit.
       usage: /ragequit
       permission: compmeme.ragequit
    
      rage:
       description: Activate or deactivate rage mode.
       usage: /rage [activate/deactivate]
       permission: compmeme.rage
       aliases: ragemode
    
      compmeme:
       description: CompMeme information command.
       usage: /compmeme <info/enable/disable>
       permission: compmeme.compmeme
       aliases: ragemode
    
    permissions:
      compmeme.*:
        default: op
        description: Ops get ALL the commands!
        children:
         compmeme.rofl: true
         compmeme.facepalm: true
         compmeme.lol: true
         compmeme.iliketrains: true
         compmeme.blamenill: true
         compmeme.odns: true
         compmeme.ragequit: true
         compmeme.rage: true
         compmeme.compmeme: true
         compmeme.enable: true
    

    lolcompmeme 的命令开头删除一个空格,并为这些命令的usagepermissiondescriptionaliases 部分删除一个空格plugin.yml

    您应该始终将您的 plugin.yml 粘贴到 YAML 解析器中,例如 http://yaml-online-parser.appspot.com/ 以确保没有错误。

    【讨论】:

      【解决方案2】:

      这一行

      at escaperestart.sircomputer.compmeme.CompMeme.onEnable(CompMeme.java:16) ~[?:?]
      

      表示。

      1.) 类escaperestart.sircomputer.compmeme.CompMeme

      Method `onEnable()`,
      
      Line 16
      

      2.) 来到 java 文件的第 16 行,

      getCommand("lol").setExecutor(Executor.lol);
      

      可能性是 - getCommand("lol") 返回 null。

      请在此处调试,不知何故仅在此处发生问题。

      【讨论】:

      • 除了第 14 行和第 15 行的过程完全相同(除了更改的 ChatColor 和字符串),那为什么 16 会有所不同?
      • @WhoKnows 似乎有些问题,您需要调试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2022-07-20
      • 2017-08-12
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多