NullPointerException ze zmiennymi statycznymi
Właśnie uderzyłem bardzo dziwne (dla mnie) zachowanie Java. Mam następujące klasy:
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);
}
I:
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
}
A mój przypadek testowy:
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 i MeterUnit są singletonami inicjowanymi statycznie, więc podczas ładowania klas. Konstruktory są prywatne, więc nie można ich zainicjować nigdzie indziej.Klasa jednostki zawiera statycznefinał odwołania do MKUnit.INSTANCE i MeterUnit.INSTANCESpodziewałbym się, że:
Załadowano klasę KMUnit i utworzono instancję.Załadowano klasę MeterUnit i utworzono instancję.Klasa jednostki jest ładowana, a zmienna KM i METERS jest inicjowana, są ostateczne, więc nie można ich zmienić.Ale kiedy uruchamiam moją skrzynkę testową w konsoli z mavenem, wynikiem jest:
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
A zabawne jest to, że kiedy uruchomię ten test z eclipse za pośrednictwem JUnit runnera, wszystko jest w porządku, nie mamNullPointerException
aw konsoli mam:
Unit.METERS: m
Unit.KM: km
Więc pytanie brzmi: co może byćPowód, dla którego zmienna KM w jednostce jest zerowa (a jednocześnie METRY nie są zerowe)