2012-08-10 12 views
16

उदाहरण के लिए:जावा कंपाइलर कभी-कभी शून्य के अनबॉक्सिंग की अनुमति क्यों देता है?

int anInt = null; 

संकलन समय पर विफल रहता है लेकिन

public static void main(String[] args) { 
    for (int i = 0; i < 10; i++) { 
    System.out.println("" + getSomeVal()); 
    } 
} 
public static int getSomeVal() { 
    return new Random().nextBoolean() ? 1 : null; 
} 

रन टाइम पर विफल रहता है (आमतौर पर)। null को वापस करने की कोशिश करने के परिणामस्वरूप संकलन त्रुटि भी होगी, इसलिए मुझे लगता है कि संकलक को null अनुमानित करने के लिए कई पथ होने के बारे में कुछ ऐसा है जो संभावित रूप से एक ऑटोबॉक्स्ड int है? जावैक एक ही त्रुटि के साथ दोनों मामलों को संकलित करने में विफल क्यों नहीं हो सकता है?

उत्तर

20

पहले मामले में, संकलक जानता है कि आप null के संकलन-समय स्थिरांक को अनबॉक्स करने का प्रयास कर रहे हैं।

दूसरे मामले में, सशर्त अभिव्यक्ति के प्रकार, Integer है तो आप को प्रभावी ढंग से लिख रहे हैं:

Integer tmp = new Random().nextBoolean() ? 1 : null; 
return (int) tmp; 

... इसलिए unboxing एक निरंतर अभिव्यक्ति पर नहीं हो रहा है, और संकलक इसे अनुमति देगा

यदि आप इसे वहाँ unboxing द्वारा बदला प्रकार int के होने की सशर्त अभिव्यक्ति के लिए मजबूर करने, यह विफल हो जाएगा:

// Compile-time failure 
return new Random().nextBoolean() ? 1 : (int) null; 
+0

पहले मामले में एक शून्य प्रकार "प्रकार" को अंतर्निहित रूप से एक प्रकार के प्रकार में डाला जा रहा है, आर एक कंपाइलर त्रुटि में उलझन में।दूसरा मामला स्पष्ट रूप से बाएं हाथ परिवर्तनीय प्रकार के लिए शून्य हो जाता है, जो वापसी मूल्य की बजाय अभिव्यक्ति का प्रकार है। मुझे लगता है कि जेएलएस 15.25 का सावधानीपूर्वक पढ़ना "यदि दूसरे और तीसरे ऑपरेंड के पास एक ही प्रकार है (जो शून्य प्रकार हो सकता है), तो वह सशर्त अभिव्यक्ति का प्रकार है।" आपको यह देता है, क्योंकि जावा कंपाइलर एक प्रकार का int नहीं दे सकता है और इसलिए इसे अनबॉक्सिंग करके दोनों के लिए इंटीजर का उपयोग करने के लिए मजबूर किया जाता है। बहुत स्पष्ट उत्तर, धन्यवाद। – MilesHampson

2

मुक्केबाजी आंशिक रूप से पुरातन और आवरण वस्तुओं इसी बीच भेद को छुपाता है, लेकिन यह नहीं करता है इसे हटा नहीं है।

दो भेद जो मुक्केबाजी से नहीं बदला जाता है:

  • वस्तुओं जबकि पुरातन
  • वस्तुओं दोनों की स्थिति और पहचान नहीं हो सकता है अशक्त हो सकता है, है, जबकि पुरातन केवल राज्य (मान) है

कभी-कभी, मुक्केबाजी का उपयोग करते समय ये मतभेद समस्याएं पैदा कर सकते हैं।

कुछ बिंदुओं को याद करने के लिए:

  • nulls के साथ सावधान रहना। एक शून्य ऑब्जेक्ट को स्वतः अनबॉक्स करने से NullPointerException का कारण बन जाएगा।
  • == और equals के साथ आइटम की तुलना करना देखभाल के साथ किया जाना चाहिए।
1

आप किसी पूर्णांक

int anInt = null; 

जावा के लिए अशक्त असाइन नहीं कर सकते यह आप के बाद से करने के लिए बताए अशक्त नहीं कर रहे हैं अनुमति देता है एक पूर्णांक

System.out.println("" + getSomeVal()); //null was just converted to a srting and was printed 

आप इस प्रदर्शन, तो आप प्राप्त कर सकते हैं त्रुटि

int anInt = getSomeVal();