来自类applyBonus()
的我的方法BonusEmporium
从City
个对象的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++;
}
}
}
答案 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循环
不要将空值放入数组
你应该没有检查空元素