2016-12-02 114 views
-1

该方案已在WeightedDie延长模具类,如下一类关系:Java的继承:在超类中调用子类方法

​​

public class WeightedDie extends Die 
{ 
    private int randomNum; 
    private int maxNumSides = 6; 
    private double [] weights; 
    private Random rand; 
    private double sum = 0; 
    private double weightRoll; 
    private int cumulWeight; 
    private double cumulWeightDouble; 


public WeightedDie() 
{ 
    super(); 
} 

public WeightedDie(double[] w) 
{ 
    ... 
} 

public int roll() 
{ 
    cumulWeight = 0; 
    cumulWeightDouble = 0; 
    weightRoll = 0; 
    rand = new Random(); 

    randomNum = rand.nextInt(100) + 1; 

    for(int i = 0; i < 6; i++) 
    { 
     weightRoll = weights[i]*100; 
     cumulWeightDouble = weightRoll + cumulWeightDouble; 
     cumulWeight = (int) cumulWeightDouble; 

     if(randomNum >= (cumulWeight - weightRoll) && randomNum <= (cumulWeight)) 
     { 
      _faceValue = i; 
      break; 
     } 
    } 
    return _faceValue; 
} 
} 

我的问题似乎是,在WeightedDie构造函数使用super()的Die构造函数。在Die构造函数中this.roll()被调用,并且这调用了WeightedDie的roll()而不是Die的roll(),它给出了一个空指针。我想在Die中使用this.roll()来调用Die的roll()方法。这怎么解决?

+0

  • 改变辊()方法名TBH我会从构造 - 它不应该存在删除'roll' - 而不是在构造Object之后,您可以调用'roll' –

  • +0

    另请参阅http://stackoverflow.com/questions/6386343/how-to-call-a-super-method-ie-tostring-from-outside- a-derived-class –

    +0

    是的,这是有道理的。这段代码是由教授提供给我的,所以我不确定我是否需要改变它。但是,我在子类的roll方法中检查了检查是否为null,如果是,则调用super.roll()。我认为这应该解决问题,谢谢! – knueser

    回答

    -1

    在模具构造this.roll()被调用,这是调用WeightedDie的卷(),而模具的卷(),

    这是正确的,但不是一个问题。

    它给出一个空指针。

    显示堆栈跟踪。可能这条线有问题:

    weightRoll = weights[i]*100; 
    

    因为weights数组未被初始化。

    看到这个:How do I declare and initialize an array in Java?

    +0

    是的,我知道该数组未初始化。我想知道是否可以在Die构造函数中调用Die's roll方法而不是WeightedDie的roll方法。正如上面所说的ScaryWombat,代码应该改变为不在构造函数中调用roll。 – knueser

    +0

    您有两种方法:1.创建Die的对象而不是WeightedDie。或2.重命名Die类中的'roll'。如果你重写,这是定义的brhaviour。 – Azodious

    -1

    我们有以下选项来解决这个问题。

    1. 通过super.roll()方法调用解决空指针异常。在超和子类
    2. 改变超类的卷()方法,以私人