Nahm für mich viel Zeit, es selbst herauszufinden,
Erstens gibt einige grundlegende Fehler, die Sie in Ihrem Code
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!
Weil Sie 'roll()' innerhalb des 'Die' Konstruktors aufrufen, bevor' cumulativeWeights' zugewiesen wurde. –
Das sollte nicht einmal kompilieren. – chrylis
Ist 'Die' eine abstrakte Klasse? –