NullPointerException 并且无法初始化处理中的草图错误

NullPointerException and couldn't initialize sketch errors in Processing

我写了一个关于两个之间引力的物理模拟 planets.It 工作得很好所以我决定把它提升到一个新的水平并使用数组和五个行星(圆圈)重写它。但是我的代码给出了奇怪的永远不会有同样的错误。我在初始化草图时遇到 NullPointerException 错误或 VM 错误(没有描述只是 "Vm error couldn't initialize skecth" 和 "see help and troubleshoot" bullsh*t)程序使用 txt 文件读取数据(双重检查和它工作正常)。 我的阵列名称和描述是

我的代码:

 public PVector[] Pos = new PVector[5];
public PVector[] Acc = new PVector[5];
public PVector[] Vel = new PVector[5];
public PVector[] Dist = new PVector[5];
public PVector[] Dir = new PVector[5];
public float[] Mass = new float[5];
void setup(){
 String Data[] = loadStrings("Data.txt");
 size(800,800);
 for(int g = 0;g < 5;g++){
   Pos[g] = new PVector(float(Data[g+1]),float(Data[g+6]));
   Vel[g] = new PVector(float(Data[g+12]),float(Data[g+17]));
   Mass[g] = float(Data[g+23]);
 }
}
void draw(){
 for (int i = 0;i < 5;i++){
   for (int f = 0;f < 5;f++){
     if(i !=f){
       if(Pos[i].x < Pos[f].x){Dir[f].x = 1;Dist[f].x = (Pos[f].x - Pos[i].x);}else{ // I get the error here
       if(Pos[i].x > Pos[f].x){Dir[f].x = -1;Dist[f].x = (Pos[i].x - Pos[f].x);}else{
       if(Pos[i].x == Pos[f].x){Dir[f].x = 0;Dist[f].x = 0;}}}
       if(Pos[i].y < Pos[f].y){Dir[f].y = 1;Dist[f].y = (Pos[f].y - Pos[i].y);}else{
       if(Pos[i].y > Pos[f].y){Dir[f].y = -1;Dist[f].y = (Pos[i].y - Pos[f].y);}else{
       if(Pos[i].y == Pos[f].y){Dir[f].y = 0;Dist[f].y = 0;}}}
       if ((Dist[f].x != 0)){
         Acc[i].x+=((6*((Mass[i]*Mass[f])/Dist[f].magSq())/10000000)/Mass[i])*Dir[f].x;// *6/1000000 is MY G constant
       }
       if ((Dist[f].y != 0)){
         Acc[i].y+=((6*((Mass[i]*Mass[f])/Dist[f].magSq())/10000000)/Mass[i])*Dir[f].y;
       }
     }
   }
   Vel[i].x = Vel[i].x + Acc[i].x;
   Vel[i].y = Vel[i].y + Acc[i].y;
   Pos[i].x = Pos[i].x + Vel[i].x;
   Pos[i].y = Pos[i].y + Vel[i].y;
   ellipse(Pos[i].x,Pos[i].y,10,10);
 }
}

您在此处创建大小为 5 的 PVectors 数组:public PVector[] Dir = new PVector[5];。此时,其中索引 0-4 有 null 五次。

因为你没有在这个数组中创建新的 PVectors,所以当你试图访问这里 Dir[f].x 中的变量 x 时,你得到了错误,因为 Dir[f] 是空的,你不能访问变量 [= null 的 16=] -> NullPointerException。

在这部分中,您将实例化一些数组

for(int g = 0;g < 5;g++){
   Pos[g] = new PVector(float(Data[g+1]),float(Data[g+6]));
   Vel[g] = new PVector(float(Data[g+12]),float(Data[g+17]));
   Mass[g] = float(Data[g+23]);
 }

您还应该为 DirAccDist

添加实例化

另请注意,您使用的是对象,而不是原始数据类型。 nullnew PVector(0,0)

不同

同样从 "design" 的角度来看,以这种方式使用数组并不是一个好方法。您应该创建自己的 class Planet,其中每个行星都保存有关其属性的信息,并且在您的主 class 中处理它们之间的交互。


如何创建 "empty" 或 "zero" 变量而不是空值?只需创建它们:)

for(int g = 0;g < 5;g++){
   Pos[g] = new PVector(float(Data[g+1]),float(Data[g+6]));
   Vel[g] = new PVector(float(Data[g+12]),float(Data[g+17]));
   Mass[g] = float(Data[g+23]);
   Dir[g] = new PVector(0,0);
   Acc[g] = new PVector(0,0);
   Dist[g] = new PVector(0,0);
 }

PS :我不知道这个 class 究竟是如何实现的,使用 new PVector()new PVector(0) 而不是 new PVector(0,0) 也可能有效。