【问题标题】:Java - Setting an object to nullJava - 将对象设置为空
【发布时间】:2016-06-06 02:56:32
【问题描述】:

我已经看到有与此类似的问题,但对于实际删除对象引用和诸如此类的东西来说,它们似乎相当小众。我正在为我正在开发的游戏开发库存系统,并根据插槽是否包含空对象来依赖物品拾取/交换/放下。

这是我的一小段代码:

public void buttonPressed(int buttonID) {
    if(buttonID < slots.length) {
        if(inHand == null) {
            if(slots[buttonID].storedItem != null) {
                inHand = slots[buttonID].storedItem;
                slots[buttonID].storedItem = null;
            }
        } else {
            if(slots[buttonID].storedItem == null) {
                slots[buttonID].storedItem = inHand;
                inHand = null;
            } else {
                Item swapSpot = inHand;
                inHand = slots[buttonID].storedItem;
                slots[buttonID].storedItem = swapSpot;
            }
        }
    }
}

检查工作正常,但是当第一个 if 语句中的代码运行时 (slots[buttonID].storedItem != null),数组中指定插槽中的 Object 'storedItem' 未设置为 null .如果那里已经有一些东西,我真诚地道歉,但我无法理解人们在说什么。

编辑:我已修复它 - 我共享的代码没有任何问题,但我的 MouseListener 的实现存在问题。长话短说,它是双重注册的,一旦你拿起一件物品,它就会立即被放下。

【问题讨论】:

  • 在我看来,这段代码应该可以正常工作 - 您如何检查并发现该字段未设置为 null?
  • 你试过用调试器单步调试吗?我认为它不太可能运行该语句,但如果是其他代码,则必须将其设置回非空值。
  • slots[]是什么类型的?
  • 这里有术语问题。没有将对象设置为空的事情。您可以将 variables 设置为 null。
  • 回答你所有的问题:slots[] 是一个大小为 4 的“Slot”类型的数组,我知道是因为我有一个空安全打印功能并且只使用标准打印,我还没有尝试过。我会尽快试一试。

标签: java object null variable-assignment reset


【解决方案1】:

你不需要大部分 if 结构,无论值是否为空,交换都将起作用。假设 0 作为 buttonID 传递,inHand 中存储了一个项目,但插槽 0 中没有项目。

public void buttonPressed(int buttonID) {
    if(buttonID < slots.length) {
        //The item in inHand is now placed into swapSpot
        Item swapSpot = inHand;
        //The null value in slots[buttonID].storedItem is now placed in inHand
        inHand = slots[buttonID].storedItem;
        //The item previously in inHand is now placed in slots[buttonID].storedItem
        slots[buttonID].storedItem = swapSpot;
    }
}

我不确定为什么您的代码不能正常工作,看起来它应该可以工作,但显然有一些乍一看不可见的错误。尝试像这样简化它。不太冗长的代码往往更不容易出错,因为它更容易管理逻辑。

【讨论】:

  • 我从来没有意识到这一点。我想这就是当您尝试尽可能快地实现某些东西时会发生的情况。非常感谢,仍在尝试追踪我的错误。据我了解,inHand 正在从其他地方重置,但我很困惑,因为我只引用了几次。哦,好的,非常感谢!
  • @CarlLitchman 正如另一位用户所说,我建议使用调试器逐步完成。在设置变量的任何时候放置断点,观察变量的值,以及放入其中的任何值。
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2015-02-16
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多