Ten fragment kodu działa dobrze: -
Integer nullInt = null;
if (1 <= 3) {
Integer secondNull = nullInt;
} else {
Integer secondNull = -1;
}
System.out.println("done");
Zgłasza to jednak wyjątek o wartości zerowej, podczas gdy środowisko Eclipse ostrzega o potrzebie automatycznego rozpakowywania:
Integer nullInt = null;
Integer secondNull = 1 <= 3 ? nullInt : -1;
System.out.println("done");
Dlaczego tak jest, czy ktoś może poprowadzić?
java
if-statement
conditional-operator
91StarSky
źródło
źródło
Jestem prawie pewien, że argumenty dla operatora trójskładnikowego muszą być tego samego typu. Ponieważ używasz -1 i jakiś stały
nullint
kompilator próbuje rozpakować,nullint
aby uzyskać wartość. A następnie autobox to do przechowywania wsecondNull
zmiennej.źródło
Wynika to z faktu, że gdy dwa operandy operatora warunkowego
? :
są typem pierwotnym i typem referencji w pudełku, następuje konwersja rozpakowywania ( JLS § 15.25.2 ):W ogóle, zastępując
if
oświadczenie o? :
wyrażeniu nie zawsze zachować rozumieniu kodeksu, ponieważ? :
samo wyrażenie musi mieć typ kompilacji. Oznacza to, że gdy typy dwóch operandów są różne, należy wykonać konwersję na jeden lub oba, aby wynik miał spójny typ czasu kompilacji.źródło
Ten działał (w Javie 1.8):
źródło