5

Rozważmy klasy:Trójkątny operator Java 8 Zestawienie z Mavenie

package be.duo.test; 

public class Main { 

    public static void main(String[] args) { 
     Main main = new Main(); 
     main.execute(); 
    } 

    private void execute() { 
     for(int i = 0; i < 10; i++) { 
      System.out.println("" + method()); 
     } 
    } 

    private int method() { 
     return (Math.random() > 0.5d) ? 1 : null; 
    } 

} 

metody (metod) jest typu int, który jest pierwotnych powrotu.

Rozważmy operator potrójny używany w rachunku Powrót:

  • kompiluje z Java 8 domyślny kompilator, ale spowoduje to NullPointerException w czasie wykonywania, dlaczego?
  • użyciu Maven to spowoduje błąd kompilacji czasu
[ERROR] error: incompatible types: bad type in conditional expression 
[ERROR] <null> cannot be converted to int 

Czy ktoś może mi wyjaśnić dlaczego zachowuje się inaczej?

+0

kompilacja odbywa się Maven –

+2

To kompiluje dobrze dla mnie z javac 1.8.0_45 –

+0

otrzymuję NullPointerException z Java 1.8.0_31 który należy się spodziewać (zakładam getIntValue() jest wywoływana w Integer.toString()). –

Odpowiedz

2

O ile mogę powiedzieć, powinno być legalne pod Java 8.

Zobacz Table 15.25-E. Conditional expression type (Reference 3rd operand, Part III):

3rd → null 
2nd ↓   
int lub(Integer,null) 

lub(Integer,null) powinny być Integer. Zasadniczo, jeśli masz warunek formularza boolean ? int : null, wynikiem wyrażenia powinno być Integer i zostanie on rozpakowany. (Myślę, że już wiesz, że tak się dzieje.)

Tak więc zgodnie ze specyfikacją powinno być takie samo.

Wygląda jak błąd kompilatora. Znalazło się sporo takich, powiedziałbym, spróbuj zaktualizować do najnowszej wersji.

0

Nie jestem pewien, której wersji Java 8 podrzędnej używasz, ale mogę skompilować pod java 1.8.

C:\Users\XXXX>javac -version 
javac 1.8.0_31 

C:\Users\XXXX>javac Main.java 

C:\Users\XXXX>java Main 
Exception in thread "main" java.lang.NullPointerException 
     at Main.method(Main.java:15) 
     at Main.execute(Main.java:10) 
     at Main.main(Main.java:5)