带有hashmap的空指针异常

时间:2012-09-06 12:06:41

标签: java nullpointerexception hashmap

这是玩家类

package day6;

public class Player {
int playerId;

public Player(int playerId) {
    super();
    this.playerId = playerId;
}

public int getPlayerId() {
    return playerId;
}

}

这是职位类

package day6;

public class Position {


    private int positionNumber = 0;

    public Position(int positionNumber) throws Exception {
        super();
        this.positionNumber = positionNumber;

    }

    public int getPositionNumber() {
        return positionNumber;
    }

    }

这是游戏类

 package day6;

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Random;

    public class Game {


        private int numberOfPlayers;


        HashMap<Player, Position> hashMapForPositionOfPlayer = new HashMap<Player, Position>(numberOfPlayers);

        @SuppressWarnings("unchecked")
        public Game(int numberOfPlayers) throws Exception {
            super();

            this.numberOfPlayers = numberOfPlayers;
            for (int i = 0; i <numberOfPlayers; i++) {
                hashMapForPositionOfPlayer.put(new Player(i), new Position(0));
            }
        }

        public void play() throws Exception {

            Position currentPosition;




                for (int i = 0; i < numberOfPlayers; i++) {

                    Player player = new Player(i);
                    currentPosition = hashMapForPositionOfPlayer.get(player);
                    int value = currentPosition.getPositionNumber();

                    }
                }
            }

我试图运行程序Game类和game.play(),但是它显示了hashmap的第0个值的空值。

对于键值0的hashmap,它表示currentPosition = null。

帮帮我......

6 个答案:

答案 0 :(得分:4)

由于您使用Player个实例作为HashMap的密钥,因此应始终如一地实施hashCode()equals(),以便有两个Player实例当他们的playerId相等时,他们被认为代表同一个玩家。

如果没有正确实施equals(),以下代码段将返回false:

Player p1 = new Player(1);
Player p2 = new Player(1);
return p1.equals(p2);

此外,鉴于您选择的Map实施的性质HashMapMap中现有密钥的检查将与其hashCode相关联,因此,有必要实施hashCode以反映两个Player实例在playerId的情况下是相等的。

以下问题可能对您有用:Understanding the workings of equals and hashCode in a HashMap

示例代码:

package day6;

public class Player {
    int playerId;

public Player(int playerId) {
    super();
    this.playerId = playerId;
}

public int getPlayerId() {
    return playerId;
}

public int hashCode(){
    return playerId.hashCode();
}

public boolean equals(Object o){
    if (o instanceOf Player) { 
        return playerId.equals( ((Player)o).getPlayerId());
    }
    return false;
}
}

答案 1 :(得分:3)

首先,我将使用ArrayList从0访问索引。

在你的情况下,你遇到的问题是Player没有实现equals和hashCode,这意味着new Player(0)new Player(0)是两个不同的对象碰巧有一个相同的值

答案 2 :(得分:2)

问题在于,Player类的两个不同实例不会相等。

Player player1 = new Player(0);
Player player2 = new Player(0);
System.out.println(player1.equals(player2));

但我认为这里的hashmap不是一个合适的结构。解决方案是将玩家存储在阵列中。

for (int i = 0; i < numberOfPlayers; i++) {
    Player player = players[i];
    // etc...
}

答案 3 :(得分:2)

根本原因是Player没有实现hashCode和equals。 因此,当hashMapForPositionOfPlayer.get(播放器)搜索地图时,它将查找具有另一个hashCode的对象,然后查找放入的对象。

将以下代码添加到Player,它应该可以解决问题

@覆盖     public int hashCode(){         返回0;     }

@Override
public boolean equals(Object obj) {
    Player other = (Player) obj;
    return this.playerId == other.playerId;
}

答案 4 :(得分:1)

您在Game的构造函数中创建了一系列玩家,并将它们放在HasMap中,但当您使用play方法查找时,您可以创建新的玩家和尝试使用那些作为查找。

这是两个不同的引用,因此HashMap找不到播放器(您刚刚创建)并返回null

创建&amp;填充HasMap

hashMapForPositionOfPlayer.put(new Player(i), new Position(0));

创建&amp;找到... Null

Player player = new Player(i); // this reference does not exist in the HasMap
currentPosition = hashMapForPositionOfPlayer.get(player);

答案 5 :(得分:1)

或者忘记使用Player作为键并改用玩家ID。

Map<Integer, Position> 

需要使用玩家ID查找位置。