gpt4 book ai didi

java - 同步线程上的 NullPointerException

转载 作者:行者123 更新时间:2023-12-01 10:56:34 24 4
gpt4 key购买 nike

好的,我已经做这个作业几个小时了。抱歉,如果英文不好,我只是从谷歌翻译的。

“对于我们的家庭作业,同步线程必须开发野生动物的模拟。将会有一种动物。我们将有一种非常特殊的 gorilla 。我们将有一个区域(20 x 20 数组)。最初我们将创建5只雄性和5只雌性 gorilla 。然后我们必须随机放置。所有 gorilla 都要在阵列中移动,一个空间中不能有超过三只 gorilla 。为了这些 gorilla 的共存必须遵循以下规则:

如果在一个细胞中发现两只 gorilla ,并且它们的性别相同,那么两只 gorilla 中的一只就会死亡(这应该是随机进行的)如果两只 gorilla 的性别不同,则一只新的 gorilla 就会出生(性别也必须选择)随机)。他们应该继续各自的道路。我们必须识别共享并同步所有线程。”

我这样做了:主要:

public static void main(String[] args) {
InformacionGorila info1 = new InformacionGorila(true, 1);
InformacionGorila info2 = new InformacionGorila(true, 2);
Gorilas gorila1 = new Gorilas(info1);
Gorilas gorila2 = new Gorilas(info2);
gorila1.start();
gorila2.start();
}

InformacionGorila 类:

public class InformacionGorila {

private boolean genero;
private String sexo;
private int id;

public InformacionGorila(boolean genero, int id) {
this.genero = genero;
this.id = id;
DecisionDeGenero(genero);
}

private void DecisionDeGenero(boolean genero) {
if (genero == true) {
setSexo("Macho");
} else if (genero == false) {
setSexo("Hembra");
}
}

public int getId() {
return id;
}

public boolean getGenero() {
return genero;
}

public void setGenero(boolean genero) {
this.genero = genero;
}

public String getSexo() {
return sexo;
}

private void setSexo(String sexo) {
this.sexo = sexo;
} }

gorilla 类:

public class Gorilas extends Thread {

private final InformacionGorila info;
private Territorio terr;

public Gorilas(InformacionGorila info) {
this.info = info;
}

public InformacionGorila getInfo() {
return info;
}

@Override
public void run() {
try {
terr.Convivencia(info);
System.out.println("Gorila: " + info.getId() + " Genero: " + info.getSexo());
} catch (Exception e) {
System.out.println(e);
}
} }

和 Territorio 类:

public class Territorio {

public boolean ocupado = false;
public int cont = 0;
Gorilas[][] gorilas = new Gorilas[20][20];

public synchronized void Convivencia(InformacionGorila info) {
while (ocupado) {
try {
wait();
} catch (InterruptedException ex) {
Logger.getLogger(Territorio.class.getName()).log(Level.SEVERE, null, ex);
}

}
cont++;
if (cont == 2) {
ocupado = true;
}

jaula(info);
}
int j = 0;
int cont2 = 0;

private synchronized void jaula(InformacionGorila info) {
String g = null;
String h = null;
while (cont2 != 2) {
if (j == 0) {
g = info.getSexo();
j++;
} else if (j == 1) {
h = info.getSexo();
}
cont2++;
}
decision(g, h);

}

public void decision(String g, String h) {
if (g.equals(h)) {
InformacionGorila info = new InformacionGorila(true, 11);
Gorilas gorila = new Gorilas(info);
gorila.start();
}
} }

当然还没有完成,但是当我尝试测试它时,当程序在 Gorilas 类方法运行中调用 terr.Convivencia(info); 时,我得到了空指针异常。有人能告诉我为什么吗?怎么了?或者我做错了什么?

以下是异常(exception)情况:

Exception in thread "Thread-0" Exception in thread "Thread-1" >java.lang.NullPointerException at hilossync.Gorilas.run(Gorilas.java:28) java.lang.NullPointerException at hilossync.Gorilas.run(Gorilas.java:28)

最佳答案

您已声明 Territorio terr,但未初始化它,使其成为空对象。

它应该读起来更像

Territorio terr = new Territorio();

关于java - 同步线程上的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33592810/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com