NullPointerException со статическими переменными
Я просто ударил очень странное (для меня) поведение Java. У меня есть следующие классы:
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);
}
А также:
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
}
И мой контрольный пример:
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 и MeterUnit оба синглтона инициализируются статически, поэтому во время загрузки класса. Конструкторы являются частными, поэтому их нельзя инициализировать где-либо еще.Класс блока содержит статическийокончательный ссылки на MKUnit.INSTANCE и MeterUnit.INSTANCEЯ ожидаю, что:
Класс KMUnit загружен и экземпляр создан.Класс MeterUnit загружен и экземпляр создан.Класс модуля загружен, и переменные KM и METERS инициализированы, они являются окончательными, поэтому их нельзя изменить.Но когда я запускаю свой тестовый пример в консоли с Maven, мой результат:
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
И самое смешное, что когда я запускаю этот тест из Eclipse через JUnit Runner, все в порядке, у меня нетNullPointerException
и в консоли у меня есть:
Unit.METERS: m
Unit.KM: km
Таким образом, вопрос: что может бытьпричина, по которой переменная KM в модуле равна нулю (и в то же время METERS не равен нулю)