2014-02-18 49 views
0

我有一个设置数组的类。另一个类扩展了这个类,并在方法中使用了所提到的数组来返回另一个数组。当我这样做时,我收到一个空异常,但是当我设置原始数组时,它工作得很好。不知道我在这里做错了什么。在这方面还是很新的。接收空指针异常

,设置了阵列(它的一部分)的类:

public class InitialGrids { 

int iic,ioc,iman ; 
int nic, noc; 
double masIC, masOC, masMAN; 
double volIC, volOC, volMAN, volP; 
double radIC, radOC, radP; 

public int iMat[ ]; 
public double rad[ ]; 
public double vol[ ]; 
public double mas[ ]; 
public double dmas[ ]; 

public double [ ] radius(int nr) 
{ 
    rad = new double [nr +1]; 

     for(int k = 0 ; k <= nic ; k++) 
     { 
      rad[ k ] = radIC * ((double) k/nic); 
      System.out.println("the radius at shell " + k + " is " + rad[k]); 

     } 

     for(int k = nic + 1 ; k <= noc ; k++) 
     {  
      rad[ k ] = radIC + ((radOC - radIC) * ((double) (k - nic)/(noc - nic))); 
      System.out.println("the radius at shell " + k + " is " + rad[k]); 

     } 

     for(int k = noc + 1 ; k <= nr ; k++) 
     { 
      rad[ k ] = radOC + ((radP - radOC) * ((double) (k - noc)/(nr - noc))); 
      System.out.println("the radius at shell " + k + " is " + rad[k]); 

     } 

     return(rad); 
} 

这是延伸InitialGrids(部分)类:

public class Compression extends InitialGrids { 

double G; 
double PI; 
double Pave; 
double x, z, dy, dz, dydx; // this is for the iteration that will update the density 
double delta; 
double mix; 

public double grav[ ]; 
public double P[ ]; 
public double rhon[ ]; 
public double radn[ ]; 

public double [ ] gravity(int nr) 
{ 
    G = Constants.PI; 
    PI = Constants.PI; 
    grav = new double [ nr + 1 ]; 

    for(int k = 1; k <= nr; k++) 
    { 
     grav[ 0 ] = 0; 
     grav[ k ] = ((G*mas[k])/(Math.pow(rad[k], 2))); 
    } 
    return(grav); 
} 

我在主类调用这些如:

InitialGrids ig = new InitialGrids(); 
ig.setup(icMat, ocMat, manMat, nr, masP, fic, foc, fman, fSi, fSi, fO); 
ig.material(nr); 
ig.radius(nr); 
ig.density(nr,fSi, fSi, foc); 
ig.volume(nr); 
ig.dmass(nr); 
ig.mass(nr); 

    Compression com = new Compression(); 
    com.gravity(nr); 
    com.pressure(nr); 
    com.newDensity(nr); 
    com.radn(nr); 
+0

您能否显示堆栈跟踪? – Mingyu

+0

你是指我的主类中调用这些方法的所有语句? – handroski

回答

0

“mas []”在您的代码中的任何位置都未初始化。除非你在其他地方初始化,否则这是你的问题。

+0

是的,它在别处。我不认为我应该添加大量的代码块来通过 – handroski

0

所以,你打破了几乎所有的规则。首先,在调用方法半径之前,字段rad未被初始化,因此在调用此方法之前,新创建的InitialGrids实例无效。

,是因为你创建的InitialGridsig一个实例,并调用radius,再Compression一个单独实例,并以某种方式预计该实例的rad将与一个在ig你的空指针发生实例?我不这么认为。

为什么这些类在继承关系呢?

+0

筛选我没有添加整个交易,但是,我在主类中调用radius方法,并在下面我称之为压缩方法。压缩需要扩展初始网格,因为如此多的依赖来自初始网格类。看起来像一个简单的方法去。 – handroski

0

最有可能的是,实例变量mas和rad应该被初始化。 可能你需要这样打电话。

Compression com = new Compression(); 
com.setup(icMat, ocMat, manMat, nr, masP, fic, foc, fman, fSi, fSi, fO); 
com.material(nr); 
com.radius(nr); 
com.gravity(nr); 

名为“com”和“ig”的实例完全不同。

+0

因此,而不是像初始化:ig.setup(...)我应该用com。(..)初始化它? – handroski

+0

ig和com共享一个基类。他们不**分享价值。你对一个值的任何修改都会对另一个的值产生影响。 – gravityplanx

+0

嗯,我有一种感觉会发生,所以我把它设置在我不想改变我在初始网格中设置的数组的位置。我只需要在Compression类中为新数组计算相同的值 – handroski