这是上下文,我正在修改一个演化算法以利用实验室的集群。所以我需要通过网络发送我们的“个人”进行评估并让他们回来。
个人看起来像:
public class Individual_Multi extends Individual implements java.io.Serializable, Clonable
{
private static final long serialVersionUID = 1L;
boolean looged, evaluated;
protected double[][] matrix = new double[9][9];
protected ArrayList<Reaction> _reactions = new ArraList<Reaction>();
... methodes ...
}
反应是:
public class Reaction implements java.io.Serializable, Clonable
{
private static final long serialVersionUID = 1L;
protected int leftEnzymeId;
//5 more
protected double k_plus;
//1 more
}
(请记住,每个人的反应数量不固定!)
我的主要:
Individual[] P_total = null;
Individual[] P_local = new Individual[n];
if(rank == 0)
{
P_total = new Individual[n*nproc];
initialize(P_total); //Populate the array
}
for(int generation = 0 ; generation < 1000 ; generation ++ )
{
MPI.COM_WOLRD.Scatter(P_total, 0, n, MPI.OBJECT, P_local, 0, n, MPI.OBJECT, 0);
for(Individual p : P_local)
p.evaluate(); <--- Error here
...
}
评估读取个人的内部并将其发送到另一个班级。
编辑:出现空指针异常的方法
public void evaluate()
{
if (evaluated == true)
return;
try
{
_fitness[0] = odesimulation.OdeImplicitSolver_Nicolas.getFitnessValue_2( this.getDescription() );
}
_fitness[1] = this._reactions.size();
evaluated = true;
}
getDescription()只是一个在所有内部调用toString()的方法,并返回连接版本。
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:277)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at Individual_Multi.evaluate(Individual_Multi.java:752)
at Evolver.run(Evolver.java:198)
at Evolver.main(Evolver.java:524)
... 6 more
(顺便说一句,如何打印堆栈的其余部分?)
当我尝试使用最少的示例时,它适用于类,但不再像这里那样使用封装。我猜这是问题所在,但对于Java来说是新手,我对解决方法没有任何线索。
作为一个懒惰的实习生,自动序列化是首选方式,但假设我们可以查明问题,我希望自己编写序列化方法。
提前谢谢你,祝你有愉快的一天! 马克。
EDIT2: 我试着用一个更简单的例子来试验:
public class DummyNestedTest implements java.io.Serializable
{
private int tab;
public DummyNestedTest(int n)
{
tab = n;
}
public void print()
{
System.out.println(tab);
}
}
顶级课程
public class DummyTest implements java.io.Serializable
{
private int[] tab;
private ArrayList<Float> array;
private DummyNestedTest nested;
public DummyTest(int n)
{
DummyNestedTest nested = new DummyNestedTest(n);
tab = new int[8];
array = new ArrayList<Float>(8);
for(int i = 0 ; i < tab.length ; i++)
{
tab[i] = n;
array.add((Float)2.f*n);
}
}
public void print()
{
System.out.println(array.toString());
System.out.println(tab[0]);
nested.print();
}
}
主要:
public class MpjTest
{
public static void main(String[] argv)
{
MPI.Init(argv);
int rk = MPI.COMM_WORLD.Rank();
int np = MPI.COMM_WORLD.Size();
int n = 20;
DummyTest[] P = null;
DummyTest[] Pt = new DummyTest[n/np];
for(int i = 0 ; i < Pt.length ; i ++)
Pt[i] = new DummyTest(rk);
if(rk == 0)
P = new DummyTest[n];
MPI.COMM_WORLD.Gather(Pt,0,n/np,MPI.OBJECT,P,0,n/np,MPI.OBJECT,0);
if(rk == 0)
for(DummyTest t : P)
t.print();
MPI.Finalize();
}
}
给出
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
0
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:277)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at DummyTest.print(DummyTest.java:25)
at MpjTest.main(MpjTest.java:33)
... 6 more
答案 0 :(得分:0)
看到藏红花的答案!
您好,您的示例中的错误来自:DummyNestedTest nested = new DummyNestedTest(n);您在此处创建了另一个引用,而不是初始化您的私有DummyNestedTest嵌套字段。相反,你需要这样做:this.nested = new DummyNestedTest(n);当您尝试调用nested.print()时,该字段未初始化的事实引发了错误。 - 藏红花