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.INSTANCE

Spodziewał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)

questionAnswers(2)

yourAnswerToTheQuestion