我已经看到有类似的问题,但它们似乎相当适合实际删除对象引用和诸如此类的东西。我正在处理我正在处理的游戏的库存系统,并且依赖于项目拾取/交换/放下,基于槽是否包含空对象。
这是我的一点代码:
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&#39; storedItem&#39;在数组的指定槽中没有设置为null。如果那里已经存在某些东西,我真诚地道歉,但我不能围绕那些人说的话。
编辑:我修复了它 - 我共享的代码没有任何问题,但是我的MouseListener的实现存在问题。简而言之,它是双重注册的,一旦你拿到一件物品,它就会立即被放回原位。
答案 0 :(得分:2)
如果结构不是大多数,那么无论值是否为空,交换都将起作用。让我们假设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;
}
}
我不确定为什么你的代码不能正常工作,它看起来应该有效,但显然有一些错误,乍一看是不可见的。尝试像这样简化它。较简洁的代码往往不易出错,因为它更容易管理逻辑。