检查数组元素是否为空

时间:2016-06-04 21:59:27

标签: java arraylist element

来自类applyBonus()的我的方法BonusEmporiumCity个对象的arrayList获取奖励对象,并将它们应用于Player个对象。 当我写这样的函数时我测试它没有问题:

public class BonusEmporium extends Bonus {
    public BonusEmporium(int cities) {
        this.setBonusType(BonusType.EMPORIUM);
        this.cities=cities;
        setCity(new ArrayList<City>(cities));
    }
    public void applyBonus(Player player){
        Bonus bonus=getCity().get(0).getBonus().get(0);//gets the first bonus from the first 
                                                       //city
        bonus.applyBonus(player);
        Bonus bonus=getCity().get(0).getBonus().get(1);//gets the second bonus from the first 
                                                       //city
        bonus.applyBonus(player);
        Bonus bonus=getCity().get(1).getBonus().get(0);//gets the first bonus from the
                                                       //second city
        bonus.applyBonus(player);
    }

}

问题是当我想在arraylists包含元素时运行它时,我如何检查数组中的元素是否为空?

public class BonusEmporium extends Bonus {
    public BonusEmporium(int cities) {
        this.setBonusType(BonusType.EMPORIUM);
        this.cities=cities;
        setCity(new ArrayList<City>(cities));
    }
    public void applyBonus(Player player){
        int i=0,j=0;

            while(j<cities){
                while(getCity().get(j).getBonus().get(i)!=null){//In theory this should 
//verify that the element bonus i from the city j is not empty
//but i get NullPointerException
                    Bonus bonus=getCity().get(j).getBonus().get(i);
                    bonus.applyBonus(player);
                    i++;
                }
                j++;
        }

    }

}

3 个答案:

答案 0 :(得分:2)

很难说出你在问什么,但你应该能够通过更好地处理message chain来避免错误。

public void applyBonus(Player player){
    List<City> cities = getCity();
    for(int i = 0; cities != null && i < cities.size(); i++){
        City c = cities.get(i);
        List<Bonus> bonuses = c.getBonus();
        for (int j = 0; bonuses != null && j < bonuses.size(); j++) {
            Bonus b = bonuses.get(j);
            if (b != null)
                b.applyBonus(player);
        }
     }
}

答案 1 :(得分:1)

您可以检查元素是否为空:

if(array != null && array.get(index) == null) // element is null when empty

检查整个数组是否为空(没有元素):

if(array != null && array.isEmpty())

答案 2 :(得分:0)

一般来说,java中的问题是链接这样的getter:

getCity().get(j).getBonus().get(i)!=null

您可以在此处从4个位置获取nullpointer异常。您可以像以下一样检查它们:

if (getCity()!=null &&
   getCity().get(j) &&
   getCity().get(j).getBonus() &&
   getCity().get(j).getBonus().get(i)!=null){
....
}

其他方式可以将整个代码封装在try-catch和捕获NPE中,这更像是hack。

我还建议使用foreach而不是将数组大小存储在单独的变量中,因为你总是可以使用

myArr.getSize()

还要检查关于ArrayList构造函数的javadoc:

new ArrayList<City>(cities)

因为这可能没有达到预期的效果

短篇小说:

在构造函数中初始化所有ArrayLists(不指定大小)

使用foreach循环

不要将空值放入数组

你应该没有检查空元素