【Android】对象为null的一个原因:在方法内部,重新创建了一个新的对象并将其赋值给原对象,但这并不会改变原始的原对象的引用

疑问

现在有代码如下:

private GameList multiGameList;

/**
 * 获取多人游戏列表
 *
 * @return 多人游戏列表
 */
public GameList getMultiGameList() {
    if (null == multiGameList) {
        createMultiOrSingleGameList(multiGameList,GameList.TYPE_MULTI);
    }
    return multiGameList;
}

/**
 * 创建多人或者单人游戏列表
 * @param gameList 游戏列表容器
 * @param type 游戏类型,1为单人,2为多人
 */
private void createMultiOrSingleGameList(GameList gameList, int type) {
    gameList = new GameList();
    for (GameList.Game game : bizGameList.getList()) {
        // 当为多人或者单人游戏的时候整理到游戏列表中
        if (game.getGameType() == type) {
            gameList.getList().add(game);
        }
    }
}

为啥我在其他类调用getMultiGameList()方法得到的对象还是null,这样写有什么问题,为什么?如何规避呢?

解答

问题出在createMultiOrSingleGameList方法中,你传递的gameList参数是一个对象的引用。在方法内部,你重新创建了一个新的GameList对象并将其赋值给gameList,但这并不会改变原始的multiGameList对象的引用。

为了解决这个问题,你可以修改createMultiOrSingleGameList方法,使其返回一个新的GameList对象,而不是使用参数进行修改。然后在getMultiGameList方法中,将返回的新对象赋值给multiGameList。

修改后的代码如下所示:

private GameList multiGameList;

/**
 * 获取多人游戏列表
 *
 *  多人游戏列表
 */
public GameList getMultiGameList() {
    if (null == multiGameList) {
        multiGameList = createMultiOrSingleGameList(GameList.TYPE_MULTI);
    }
    return multiGameList;
}

/**
 * 创建多人或者单人游戏列表
 *  type 游戏类型,1为单人,2为多人
 */
private GameList createMultiOrSingleGameList(int type) {
    GameList gameList = new GameList();
    for (GameList.Game game : bizGameList.getList()) {
        // 当为多人或者单人游戏的时候整理到游戏列表中
        if (game.getGameType() == type) {
            gameList.getList().add(game);
        }
    }
    return gameList;
}

这样修改后,调用getMultiGameList方法会返回正确的multiGameList对象,而不是null。

你可能感兴趣的:(bug记录,Java基础知识,android,java,开发语言)