NullPointerException mit statischen Variablen
Ich habe gerade sehr merkwürdiges (für mich) Verhalten von Java getroffen. Ich habe folgende Kurse:
public abstract class Unit {
public static final Unit KM = KMUnit.INSTANCE;
public static final Unit METERS = MeterUnit.INSTANCE;
protected Unit() {
}
public abstract double getValueInUnit(double value, Unit unit);
protected abstract double getValueInMeters(double value);
}
Und:
public class KMUnit extends Unit {
public static final Unit INSTANCE = new KMUnit();
private KMUnit() {
}
//here are abstract methods overriden
}
public class MeterUnit extends Unit {
public static final Unit INSTANCE = new MeterUnit();
private MeterUnit() {
}
///abstract methods overriden
}
Und mein Testfall:
public class TestMetricUnits extends TestCase {
@Test
public void testConversion() {
System.out.println("Unit.METERS: " + Unit.METERS);
System.out.println("Unit.KM: " + Unit.KM);
double meters = Unit.KM.getValueInUnit(102.11, Unit.METERS);
assertEquals(0.10211, meters, 0.00001);
}
}
MKUnit und MeterUnit sind beide Singletons, die statisch initialisiert werden, also während des Ladens der Klasse. Konstruktoren sind privat, können also nirgendwo anders initialisiert werden.Die Einheitenklasse enthält statischeFinale Verweise auf MKUnit.INSTANCE und MeterUnit.INSTANCEIch würde folgendes erwarten:
Die KMUnit-Klasse wird geladen und die Instanz erstellt.Die MeterUnit-Klasse wird geladen und die Instanz erstellt.Die Einheitenklasse wird geladen und die Variablen KM und METERS werden initialisiert. Sie sind endgültig und können nicht geändert werden.Aber wenn ich meinen Testfall in der Konsole mit maven laufen lasse, ist mein Ergebnis:
T E S T S
Running de.audi.echargingstations.tests.TestMetricUnits<br/>
Unit.METERS: m<br/>
Unit.KM: null<br/>
Tests run: 3, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.089 sec <<< FAILURE! - in de.audi.echargingstations.tests.TestMetricUnits<br/>
testConversion(de.audi.echargingstations.tests.TestMetricUnits) Time elapsed: 0.011 sec <<< ERROR!<br/>
java.lang.NullPointerException: null<br/>
at <br/>de.audi.echargingstations.tests.TestMetricUnits.testConversion(TestMetricUnits.java:29)
<br/>
Results :
Tests in error:
TestMetricUnits.testConversion:29 NullPointer
Und der lustige Teil ist, dass ich, wenn ich diesen Test von Eclipse über JUnit Runner durchführe, alles in Ordnung istNullPointerException
und in der Konsole habe ich:
Unit.METERS: m
Unit.KM: km
Die Frage ist also: Was kann das sein?Grund, warum die KM-Variable in Unit null ist (und gleichzeitig ist METERS nicht null)