当前位置: 首页 > 知识库问答 >
问题:

为什么这段代码只在我穿靴子的时候输出“Test”,而在我脱靴子的时候却从来没有输出“no”?

苏振国
2023-03-14

以下是代码:

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
    Player p = event.getPlayer();
    ItemStack boots = p.getInventory().getBoots();
    if (!boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.sendMessage("no");
        p.setAllowFlight(false);
    }
    if (boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.setAllowFlight(true);
        p.sendMessage("Test");
    }

}

为了指定,当我穿上靴子并移动时,它会输出测试。当我脱下靴子时,它什么也不输出。请告诉我我做错了什么,谢谢!

共有1个答案

微生耘豪
2023-03-14

因为你没有穿靴子。我会逐行分解:)

前三行很明显

@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
    Player p = event.getPlayer();

在这里,您创建了一个变量boots,并为其提供了库存价值。getBoots();如果玩家戴着它们,它将返回一个物品堆栈。如果查看服务器控制台,您可能会得到一个NullPointerException,因为如果玩家没有穿靴子,那么boots变量将为null。

    ItemStack boots = p.getInventory().getBoots();

现在你检查靴子的显示名称是否不等于“§3元素靴子”,如果玩家穿着靴子,这一切都很好。在你的情况下,当靴子关闭,引导变量执行为空时,你试图访问一个不存在的项目的显示名称,所以什么都不会发生(除了NPE错误)。(这一行还有另一个问题,我会在回复底部解释)

    if (!boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.sendMessage("no");
        p.setAllowFlight(false);
    }

同样的问题也在这里发生

    if (boots.getItemMeta().getDisplayName().equals("§3Elemental Boots")) {
        p.setAllowFlight(true);
        p.sendMessage("Test");
    }
}

解决这个问题的方法是添加另一个if语句,以确保玩家穿着靴子。你可以这样做:

if(p.getInventory().getBoots().equals(null)) {
    //Gets called when the player isn't wearing boots
    p.sendMessage("You aren't wearing any boots!")
} else {
    //Gets called when the player is wearing boots
    ItemStack boots = p.getInventory().getBoots();
    //Rest of your code
}

上面的第二个问题是,使用Java时,文本中的颜色可能会很奇怪,使用时可能会遇到问题。等于(“§3Elemental Boots”)这里有两个选项,

  • 选项1,使用:。equals(ChatColor.translateAlternateColorCodes(“§”和“§3Elemental Boots”)在生成任何带有颜色的字符串时,也应该使用ChatColor方法
  • 选项2,使用:ChatColor。StripColor(boots.getItemMeta()。getDisplayName())。等于(“元素靴”)

我个人倾向于第二种选择

我希望这有帮助!

 类似资料:
  • 问题内容: 考虑以下Java源代码: 该是。 为什么该语句有时会抛出? 谢谢。 问题答案: 线程安全 如果您的代码是多线程的,则有可能。例如: 如果在语句执行之后(但在循环之前)立即将另一个线程设置为,则您将获得一个。通过使用访问器(与延迟初始化结合使用)可以避免这种情况。 另外,如其他人所提到的,如果可能,请避免使用有利于泛型的此类循环构造。有关详细信息,请参见其他答案。 配件提供保护 如果始终

  • 我的档案是这样的。 Kitten.java price.java KittenService.java

  • 问题-小鲍比喜欢巧克力。他经常去他最喜欢的商店——佩妮阿姨——买巧克力。他们在佩妮阿姨有促销活动。如果鲍比存了足够的包装纸,他可以把它们上交免费巧克力。 例如,鲍比必须花每根巧克力棒的钱。他可以上交包装纸来收到另一根巧克力棒。最初,他买巧克力棒,吃完后有包装纸。他上交了它们,留给他更多的巧克力棒。吃完这两根,他有包装纸,然后留下包装纸和他的新酒吧。一旦他吃了那根,他就有包装纸,然后把它们上交另一根

  • 我运行这段代码的时候,点击部件就会出现 Uncaught TypeError: Cannot read properties of undefined (reading 'position')at VertexEnumerator.js:87:28 这样的错误

  • 问题内容: 在我的应用程序中,有时会引发以下异常: 很难找到错误,因为在stacktrace中没有列出我的方法。那么,有人知道何时抛出此异常吗?感谢您的任何提示。 问题答案: 您可以在stacktrace中看到错误: 适配器的内容已更改,但ListView没有收到通知。确保不从后台线程修改适配器的内容,而仅从UI线程修改。 您应该调查一个线程,并使其与UI线程同步。 在Android中执行此操作的

  • 我正在运行一个模型来检测图像中一些有趣的特征。我有一组600x200像素的图像。这些图像具有我想识别的岩石碎片等特征。想象一个(4x12)网格覆盖在图像上,我可以使用注释器工具手动生成注释,例如((4,9),(3,10),(3,11),(3,12)),以识别图像中感兴趣的单元格。我可以用Keras建立CNN模型,输入为灰度图像。但我应该如何对输出进行编码。在我看来,一种直观的方法是将其视为形状的稀