5

साथ संकलन इस वर्ग पर विचार करें:त्रिगुट ऑपरेटर, 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; 
    } 

} 

विधि() है लौटने प्रकार int है, जो एक आदिम प्रकार है।

त्रिगुट वापसी कथन में इस्तेमाल ऑपरेटर पर विचार करें:

  • यह जावा 8 डिफ़ॉल्ट संकलक के साथ संकलित है, लेकिन इस, क्यों रनटाइम पर एक NullPointerException में परिणाम होगा?
  • Maven का उपयोग कर इस एक संकलन समय त्रुटि में परिणाम होगा
[ERROR] error: incompatible types: bad type in conditional expression 
[ERROR] <null> cannot be converted to int 

किसी क्यों यह अलग बर्ताव मुझे लिए व्याख्या कर सकते हैं?

+0

किया संकलन Maven –

+2

साथ यह javac 1.8.0_45 –

+0

मैं जावा 1.8.0_31 के साथ एक NullPointerException जो उम्मीद की जा करने के लिए है पाने के साथ मेरे लिए ठीक संकलित (मुझे लगता है getIntValue() Integer.toString में बुलाया जा रहा है())। –

उत्तर

2

जहां तक ​​मेरा बता सकते हैं, यह जावा 8.

के तहत कानूनी हो Table 15.25-E. Conditional expression type (Reference 3rd operand, Part III) देखें करना चाहिए:

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

lub(Integer,null)Integer होना चाहिए। असल में यदि आपके पास फॉर्म boolean ? int : null का सशर्त है, तो अभिव्यक्ति का परिणाम Integer होना चाहिए और यह अनबॉक्स हो जाता है। (मुझे लगता है कि आप पहले ही जानते हैं कि यह होता है।)

तो विनिर्देश के अनुसार यह वही होना चाहिए।

एक कंपाइलर बग की तरह लगता है। इनमें से कुछ पाए गए हैं, मैं कहूंगा कि नवीनतम संस्करण में अपडेट करने का प्रयास करें।

0

सुनिश्चित नहीं है कि आप कौन सा जावा 8 मामूली संस्करण उपयोग करते हैं, लेकिन मैं जावा 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) 
संबंधित मुद्दे