2016-12-02 6 views
-1

Das Programm hat eine Klasse Beziehung, in der WeightedDie das Die Klasse erstreckt sich wie folgt:Java-Vererbung: Aufruf Unterklasse Methode in Superklasse

import java.util.Random; 

public class Die 
{ 
    private int _maxNumSides; 
    private Random _rand; 
    // class level variable with visibility for sub classes 
    protected int _faceValue; 
    public final static int DEFAULT_SIDES = 6; 

    // no param constructor for normal 6 sided die 
    public Die() 
    { 
     _rand = new Random(); 
     _maxNumSides = DEFAULT_SIDES; 
     this.roll(); 
    } 

    // will randomly reset the number of dots showing on a side 
    public int roll() 
    { 
     _faceValue = _rand.nextInt(_maxNumSides) + 1; 
     return _faceValue; 
    } 

    ... 

} 

und

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; 
} 
} 

Mein Problem scheint, dass die zu sein Der WeightedDie-Konstruktor verwendet den Die-Konstruktor mit super(). Im Die-Konstruktor wird this.roll() aufgerufen, und dies ruft Wheel() von WeightedDie anstelle von Die's roll() auf, was einen Nullzeiger ergibt. Ich möchte this.roll() in Die, um die roll() -Methode von Die aufzurufen. Wie kann das behoben werden?

+0

TBH würde ich 'roll' aus dem Konstruktor entfernen-es nicht da sein sollte - und dann, nachdem das Objekt konstruiert ist, kannst du 'roll' anrufen –

+0

Siehe auch http://StackOverflow.com/questions/6386343/How-to-Call-As-Super-Method-ie-Tostring-from-Out-Side- a-derived-class –

+0

Ja, das macht Sinn. Dieser Code wurde mir von einem Professor zur Verfügung gestellt, also bin ich mir nicht sicher, ob ich ihn ändern soll. Ich überprüfte jedoch die Roll-Methode der Unterklasse, um nach Null zu suchen, und falls dies der Fall ist, super.roll() aufzurufen. Ich denke, das sollte die Dinge reparieren, danke! – knueser

Antwort

-1

im Gesenk Konstruktor this.roll() aufgerufen wird, und diese WeightedDie der Rolle() anstelle von Der rollen() ruft,

Das ist richtig, aber kein Problem.

, die einen Null-Zeiger gibt.

Zeigen Sie die Stack-Trace. wahrscheinlich diese Linie hat Frage:

weightRoll = weights[i]*100; 

weil weights Array nicht initialisiert wird.

sehen: How do I declare and initialize an array in Java?

+0

Ja, mir ist bewusst, dass das Array nicht initialisiert ist. Ich frage mich, ob es möglich ist, die Roll-Methode von Die im Die-Konstruktor anstatt der Roll-Methode von WeightedDie aufzurufen. Wie schon oben erwähnt, sollte der Code so geändert werden, dass er im Konstruktor nicht rollt. – knueser

+0

Sie haben zwei Möglichkeiten: 1. Erstellen Sie die Objekte von Die anstelle von WeightedDie. ODER 2. Benenne 'roll' in Die Klasse um. Wenn Sie überschreiben, ist das der definierte Brahiour. – Azodious

-1

wir unter Optionen haben dieses Problem zu beheben.

  1. Invoke von super.roll() -Methode Auflösung Nullzeiger Ausnahme.
  2. Änderung Rolle() Methodennamen in Super- und Unterklasse
  3. die Rolle() -Methode in Superklasse Wechsel zu privaten
Verwandte Themen