2016-11-29 4 views
1

Ich bin verwirrt, warum dieses Array (CumulativeWeights) als null bezeichnet wird. Hier ist meine (vereinfacht) Code:Warum ist dieses Array null, wenn es bereits initialisiert wurde?

public class WeightedDieTester 
{ 
    public static void main(String[] args) 
    { 
     WeightedDie d = new WeightedDie(); 
    } 
} 

public class Die 
{ 
    public Die() 
    { 
     this.roll(); 
    } 
} 

public class WeightedDie extends Die { 
    double[] cumulativeWeights = {.1, .2, .3, .4, .5, 1}; 

    public WeightedDie() { 
    } 
    public int roll() { 

     for (int i = 0; i < cumulativeWeights.length; i++) { //this is where the nullpointerException is occuring 
      if (randNum < cumulativeWeights[i]) { 
       return i + 1; 
      } 
     } 
     return 6; 
    } 
} 

Also ja, cumulativeWeights initialisiert wurde und darf nicht null sein. Weiß jemand, warum ich diese Null-Null-Wahrnehmung bekomme?

+4

Weil Sie 'roll()' innerhalb des 'Die' Konstruktors aufrufen, bevor' cumulativeWeights' zugewiesen wurde. –

+4

Das sollte nicht einmal kompilieren. – chrylis

+0

Ist 'Die' eine abstrakte Klasse? –

Antwort

2

Innerhalb des Konstruktors der Superklasse werden die Felder einer Klasse nicht initialisiert. Sie sollten Roll nicht von diesem Punkt aus anrufen. Instanzen werden von der am weitesten entfernten Superklasse bis zur Klasse der Instanz initialisiert (und Konstruktoren werden aufgerufen).

3

Java führt in dieser Reihenfolge

Parent static block 
Child static block 
Parent initialization block 
Parent Constructor 
Child initialization block 
Child Constructor 

Daher wird, wenn Sie Rolle von Dem nennen, Array noch nicht initialisiert ist.

0

Wenn die kumulativen Gewichte keine objektspezifischen Daten sind, machen Sie sie statisch.

2

Nahm für mich viel Zeit, es selbst herauszufinden,

Erstens gibt einige grundlegende Fehler, die Sie in Ihrem Code

  1. Sie rufen nicht von overridable Methoden getan haben ein Konstruktor. Hier rufen Sie die Funktion roll() auf, die in der Kindklasse überschrieben wird.

    public Die() 
    { 
        this.roll(); // shouldn't be done. 
    } 
    

2.You keine Kompilierung-Fehler erhalten, weil Sie die Variable cumulativeWeights in Ihrem Kind Klasse deklariert haben. Da das Objekt WeightedDie noch nicht fertiggestellt ist, sind die Werte zu diesen Variablen noch nicht initialisiert.

3. Da Werte nicht auf cumulativeWeights initialisiert werden, erhalten Sie eine Nullzeigerausnahme. (Aber es ist bereits deklariert, so dass der Compiler lassen Sie uns ohne Fehler kompilieren)

4.Siehe die Ausgabe des unten formatierten Codes. Und beim nächsten Mal vorsichtig sein, während eine überschreibbare Methode von Ihrem Konstruktor aufruf

/* package whatever; // don't place package name! */ 

import java.util.*; 
import java.lang.*; 
import java.io.*; 
class Die 
{ 
    public double[] cumulativeWeights = {.1, .2, .3, .4, .5, 1}; 
    public Die() 
    { 
     System.out.println("constructing die"); 
     this.roll(); 
    } 
    public int roll(){ 
     return 1; 
    } 
} 
class WeightedDie extends Die { 
    int randNum = 33; // value 0 is used because randNum isn't even initialized 
    // even in your code!! cumulativeWeights is just declared, so no compile time error, you are using it even before the constructor of the child class is called!!!! 
    public WeightedDie() { 
     System.out.println("constructing weighteddie"); 
    } 
    @Override 
    public int roll() { 
     System.out.println("using weighteddie and randNum = "+randNum); 
     for (int i = 0; i < cumulativeWeights.length; i++) { //this is where the nullpointerException is occuring 
      if (randNum < cumulativeWeights[i]) { 
       return i + 1; 
      } 
     } 
     return 6; 
    } 
} 
/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main(String[] args) 
    { 
     WeightedDie d = new WeightedDie(); 
    } 
} 

Ausgang:

constructing die 
using weighteddie and randNum = 0 
constructing weighteddie 

Ich hoffe, dass Sie meinen Punkt. Prost!

Verwandte Themen