0

我正在尝试遍历对象列表以找出哪些对象在互相争斗。我使用该checkedGladiators列表作为比较对象,以防止它检查已分配到战斗的角斗士,因为每个尚未分配的角斗士都s将围绕他们进行整个战斗。目前我得到了一个NullPointerException,所以我使用了一些测试文本来确定它发生在listContains(checkedGladiators,s). 我在它之前添加了部分。现在问题也发生在“Null”和“Null Changed”之间,这对我来说毫无意义。

for (Gladiator s : gladiators){
    if (checkedGladiators == null) {
        System.out.println("Null");
        combat1.add(s);
        checkedGladiators.add(s);   
        System.out.println("Null Changed"); 
    }
    if (listContains(checkedGladiators,s)) { 
        // if gladiator is already in a combat do nothing
    } else { // if he isn't

    }

}

列表包含类:

public boolean listContains(List<Gladiator> List, Gladiator search) {
    for (Gladiator p : List) {
        if (p.equals(search)) {
        return true;
        }
    }
    return false;

}

有谁知道为什么会发生这种情况?谢谢

编辑1:

public class Ai {
private List<Gladiator> gladiators;
private List<List<Gladiator>> combatsList;
private List<Gladiator> checkedGladiators;
private List<Gladiator> combat1;
private List<Gladiator> combat2;
private List<Gladiator> combat3;
private List<Gladiator> combat4;
private List<Gladiator> combat5;
private List<Gladiator> combat6;    
private List<Gladiator> combat7;    
private List<Gladiator> combat8;    
private List<Gladiator> guardList;
private List<Gladiator> advanceList;
private List<Gladiator> retreatList;
int totalCombats = 0; // total combats going on

我已经在类中初始化了列表变量。

4

6 回答 6

6

您忘记创建 checkedGladiators 对象。

因此,在循环之前创建对象:

List<Gladiators> checkGladiators = new ArrayList<Gladiators>();

然后,在您的循环中,而不是测试 checkGladiators == null ...

测试 checkGladiators.isEmpty()。

于 2013-06-08T18:07:44.257 回答
3

if(checkedGladiators ==null)是真的,你正在添加一些东西,

肯定会的throw a NullPointerException,因为你在 null 上操作

谢谢阿比

于 2013-06-08T18:02:09.247 回答
1

为什么你需要做这一切?为什么这还不够?

// This has your data in it.
List<Gladiators> gladiators = new ArrayList<Gladiators>();
// Obviously some attributes, including a unique key or name.  
// MUST override equals and hashcode properly
Gladiator g = new Gladiator();
if (gladiators.contains(g)) {
  // do something here.
}

NullPointerException是最容易解决的问题之一。在打开调试的 IDE 中运行您的代码,并在堆栈跟踪表明发生异常的位置放置一个断点。你会很快弄清楚为什么你认为不应该为空的东西违反了你的假设。

于 2013-06-08T18:01:29.060 回答
0

checkedGladiators什么时候null尝试添加它(好像它是一个列表/集合/等)。

...
if (checkedGladiators == null) {
    ...
    checkedGladiators.add(s);   // <-- You handle 'checkedGladiators'
                                // <-- as an instaciated, when it is 'null'

改为这样做:

...
if (checkedGladiators == null) {
    ...
    checkedGladiators = new ArrayList<...>();   // <-- instanciate appropriately
    checkedGladiators.add(s);  
    ...
于 2013-06-08T18:03:18.037 回答
0

而不是检查System.out.println,使用StackTracedebugger类似eclipse。我会明确指出。

  if (checkedGladiators == null) { 
            System.out.println("Null");
            combat1.add(s);
            checkedGladiators.add(s);  --> checkedGladiators is null here. Here null pointer exception will occur. 
            System.out.println("Null Changed"); 
        }
于 2013-06-08T18:03:39.130 回答
0

您检查 checkedGladiators 是否为空,然后在其上调用方法:

if (checkedGladiators == null) { // <-- null!!
   checkedGladiators.add(s); // <-- null pointer exception.
}
于 2013-06-08T18:05:58.040 回答