5

Considerate questa classe:operatore ternario in Java 8, compilation con Maven

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; 
    } 

} 

Il metodo() è di tipo int, che è un tipo primitivo tornare.

consideri l'operatore ternario utilizzato nella dichiarazione di ritorno:

  • compila con il compilatore di default Java 8, ma questo si tradurrà in un NullPointerException in fase di esecuzione, perché?
  • usando Maven questo si tradurrà in un errore di compilazione
[ERROR] error: incompatible types: bad type in conditional expression 
[ERROR] <null> cannot be converted to int 

Qualcuno può spiegare a me perché si comporta diverso?

+0

compilazione fatto con Maven –

+2

Si compila bene per me con javac 1.8.0_45 –

+0

ho un NullPointerException con Java 1.8.0_31, che ci si può aspettare (presumo getIntValue() viene chiamato in Integer.toString()). –

risposta

2

Per quanto posso dire, dovrebbe essere legale in Java 8.

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

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

lub(Integer,null) dovrebbe essere Integer. Fondamentalmente se si dispone di un condizionale del modulo boolean ? int : null, il risultato dell'espressione deve essere Integer e viene rimosso. (Penso che tu sappia già che questo è quello che succede.)

Quindi secondo le specifiche dovrebbe essere lo stesso.

Sembra un bug del compilatore. Ne sono stati trovati alcuni, direi di provare ad aggiornare alla versione più recente.

0

Non sono sicuro quale versione secondaria di Java 8 usi, ma posso compilare sotto 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)