【问题标题】:Getting a String from an ArrayList returns null从 ArrayList 获取字符串返回 null
【发布时间】:2013-10-25 15:10:44
【问题描述】:

我有一个 ArrayList 的 Tiles 有两个值;一个 int 和一个 String。

我需要获取这两个值,所以在编写代码时我决定确保它正常工作:

private void setIcons()
    {
        ArrayList<Tiles> tiles = new ArrayList<>();
        tiles = game.getTiles(0);
        Tiles i = tiles.get(0);
        String s = i.returnTileName();
        System.out.println(i.returnTileName() +" ," +i.returnTileNumber());
    }

这是我的 Tiles 类,它有子类:

public class Tiles
{
    int number;
    String name;

    public Tiles()
    {

    }

    public String returnTileName()
    {
        return name;
    }

    public int returnTileNumber()
    {
        return number;
    }
}

'Tiles' 有几个子类,结构几乎相同:

public class Bamboo extends Tiles
{
    int number;
    String name;
    public Bamboo(int number, String name)
    {
        this.number = number;
        this.name = name;
    }
}

当我运行它时,String 返回为“null”,而我的 int 返回为“0”,当它们明显具有值时,如下图所示。

http://img716.imageshack.us/img716/6154/emx4.jpg

我在 setIcons() 中调用的方法:

 public ArrayList getTiles(int playerX)
    {
        ArrayList<Tiles> tiles = new ArrayList<>();
        Player pl = player.get(playerX);
        tiles = pl.playerTiles;
        return tiles;
    }

“Game”类中有两个 ArrayList,“tilesDeck”是 Tiles 的 ArrayList,“player”是 Player 类的 ArrayList。

这是我的游戏课。以前不知道它有滚动功能。

public class Game
{
    ArrayList<Tiles> tilesDeck = new ArrayList<>();
    ArrayList<Player> player = new ArrayList<>();

    public Game()
    {
        addTile("Bamboo", 1);
        addTile("Bamboo", 2);
        addTile("Bamboo", 3);
        addTile("Bamboo", 4);
        addTile("Bamboo", 5);
        addTile("Bamboo", 6);
        addTile("Bamboo", 7);
        addTile("Bamboo", 8);
        addTile("Bamboo", 9);

        addTile("Circles", 1);
        addTile("Circles", 2);
        addTile("Circles", 3);
        addTile("Circles", 4);
        addTile("Circles", 5);
        addTile("Circles", 6);
        addTile("Circles", 7);
        addTile("Circles", 8);
        addTile("Circles", 9);

        addTile("Characters", 1);
        addTile("Characters", 2);
        addTile("Characters", 3);
        addTile("Characters", 4);
        addTile("Characters", 5);
        addTile("Characters", 6);
        addTile("Characters", 7);
        addTile("Characters", 8);
        addTile("Characters", 9);

        addTile("Dragons", 1);
        addTile("Winds", 1);

        Collections.shuffle(tilesDeck);
        player.add(new Player("Player 1"));
        player.add(new Player("Player 2"));
        player.add(new Player("Player 3"));
        player.add(new Player("Player 4"));

        startTiles();
    }

    private void addTile(String name, int number)
    {
        int counter = 0;
        if (name.contains("Bamboo"))
        {
            while (counter < 4)
            {
                tilesDeck.add(new Bamboo(number, name));
                counter++;
            }
        }

        if (name.contains("Circles"))
        {
             while (counter < 4)
            {
                tilesDeck.add(new Circles(number, name));
                counter++;
            }
        }

        if (name.contains("Characters"))
        {
             while (counter < 4)
            {
                tilesDeck.add(new Characters(number, name));
                counter++;
            }
        }

        if (name.contains("Winds"))
        {
             while (counter < 4)
            {
                tilesDeck.add(new Winds("East"));
                tilesDeck.add(new Winds("South"));
                tilesDeck.add(new Winds("West"));
                tilesDeck.add(new Winds("North"));
                counter++;
            }
        }

        if (name.contains("Dragons"))
        {
             while (counter < 4)
            {
                tilesDeck.add(new Dragons("Red"));
                tilesDeck.add(new Dragons("Green"));
                tilesDeck.add(new Dragons("White"));
                counter++;
            }
        }
    }

    private void startTiles()
    {
        int playerCounter = 0;

        while (playerCounter < 4)
        {
            Player pl = player.get(playerCounter);
            int counter = 0;
            while (counter <13)
            {
                pl.playerTiles.add(tilesDeck.get(0));
                tilesDeck.remove(0);
                counter++;
            }
            playerCounter++;
        }
    }

    public ArrayList getTiles(int playerX)
    {
        ArrayList<Tiles> tiles = new ArrayList<>();
        Player pl = player.get(playerX);
        tiles = pl.playerTiles;
        return tiles;
    }
}

【问题讨论】:

  • 它们显然没有值,正如您在运行程序时看到的那样。
  • 请添加更多关于gamegame.getTiles(0)指令的信息
  • 我认为这里的代码不足以让我们发现错误。
  • 截图表明iTiles的子类的一个实例。如果是这样,该方法是否在其中被覆盖?查看其来源可能会有所帮助。
  • 从其中一个子类中添加了一些代码。

标签: java arraylist


【解决方案1】:
public Tiles()
{

}

在那里初始化你的变量。

【讨论】:

    【解决方案2】:

    用一些默认值初始化你的变量以避免得到空值。

    public class Tiles
    {
    // assign your default values
    int number = 1;           
    String name = "default name";
    
    public Tiles()
    {
    
    }
    
    public String returnTileName()
    {
        return name;
    }
    
    public int returnTileNumber()
    {
        return number;
    }
    }
    

    【讨论】:

    • 当我将代码更改为此时,它会返回“1”和“默认名称”。
    • 是的,因为您已经使用这些值初始化了变量。将其更改为您想要的任何内容。
    • 他们的子类应该改变吗?还是我误解了什么?
    【解决方案3】:

    您必须在构造函数中初始化变量

    【讨论】:

    • 我已经在我的子类中初始化了它们......这足够好吗?感谢您的回复。
    【解决方案4】:

    问题是您的子类正在创建重复的数字和名称变量:

    public class Bamboo extends Tiles
    {
        int number; // <-- remove this
        String name; // <-- and this
        public Bamboo(int number, String name)
        {
            this.number = number;
            this.name = name;
        }
    }
    

    Class Bamboo 正在初始化重复的 number 和 name 变量,但 returnTileName()returnTileNumber() 方法正在从 Tiles 超类返回未初始化的变量。

    【讨论】:

    • 谢谢!这解决了它。如果我有足够的“声誉”,我会支持你的回复。再次,非常感谢。
    猜你喜欢
    • 2013-01-30
    • 2021-02-03
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2012-10-16
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多