2015-02-16 4 views
11

में अलग-अलग काम करता है तो मैं और true मानों के बीच if खंड के बीच अंतर जानना चाहता हूं। जब मैं true के बजाय Boolean.TRUE का उपयोग करता हूं तो यह मुझे एक संकलन त्रुटि क्यों देता है (कि एक मान प्रारंभ नहीं किया जा सकता है)।यदि (Boolean.TRUE) {...} और यदि (सत्य) {...} जावा

public class Test { 

    public void method1() { 
     int x; 
     if(Boolean.TRUE) { 
      x = 200; 
     } 
     System.out.println("x: " + x); // Compilation error  
    } 

    public void method2() { 
     int x; 
     if(true) { 
      x = 200; 
     } 
     System.out.println("x: " + x); // Compiles fine 
    } 
} 
+1

इसका कोई मतलब नहीं है। सत्य की सत्यता की जांच करने का क्या मतलब है? –

+2

@ लॉरेंसएइल्लो: आप प्रश्न का बिंदु खो रहे हैं। एक मामले में संकलक सही ढंग से अभिव्यक्ति की पहचान कर सकता है हमेशा दूसरे में, यह नहीं कर सकता है। –

+4

यह एक त्रुटि फेंकता है, लेकिन यह है कि "मान x प्रारंभ नहीं किया जा सकता है"। और ऐसा इसलिए है क्योंकि बूलियन के पीछे। सच है कि 'झूठा' भी छिपा सकता है। – 1Darco1

उत्तर

10

लघु जवाब
if (true) लिए संकलक मान सकते हैं कि x से पहले इसे पढ़ा जा रहा है प्रारंभ कर दिया गया है

नीचे मेरी कोड है। यह if (Boolean.TRUE) मामले के लिए नहीं है।

औपचारिक जवाब:

[...] एक declarator एक प्रारंभ अभिव्यक्ति नहीं है, तो, :
सभी स्थानीय चर पढ़ा जा रहा से पहले एक निश्चित काम (14.4.2. Execution of Local Variable Declarations) होना चाहिए तो परिवर्तनीय के प्रत्येक संदर्भ को के लिए असाइनमेंट के निष्पादन से पहले किया जाना चाहिए, या §16 के नियमों द्वारा संकलित-समय त्रुटि उत्पन्न होती है।

इस मामले में वहाँ एक if बयान कोड वेरिएबल का संदर्भ पूर्ववर्ती में शामिल है, तो संकलक कुछ प्रवाह विश्लेषण करता है। लेकिन, जैसा कि Chapter 16. Definite Assignment में लिखा:

सशर्त बूलियन ऑपरेटरों &&, || की विशेष उपचार के अलावा

, और ? : और बूलियन मान निरंतर भाव की, भाव के मूल्यों में ध्यान में रखा नहीं कर रहे हैं प्रवाह विश्लेषण।

true के बाद से

तो है एक बूलियन मान constant expression और Boolean.TRUE (जो ढेर पर एक मूल्य के लिए एक संदर्भ है, ऑटो unboxing आदि के अधीन) is not यह इस प्रकार है कि

if (true) { 
    x = 200; 
} 

एक निश्चित पैदावार x का असाइनमेंट जबकि

if (Boolean.TRUE) { 
    x = 200; 
} 

नहीं है।

1

यह इस त्रुटि को फेंक देता है क्योंकि यह नहीं जानता कि Boolean.TRUE के पीछे क्या छिपा है। TRUE कक्षा बूलियन में प्रकार बूलियन का एक स्थिर क्षेत्र है, लेकिन इसका मूल्य false भी हो सकता है। यह स्पष्ट रूप से नहीं है, 'हालांकि।

5

अंतर मौजूद है क्योंकि एक वास्तविक स्थिर है जबकि दूसरा सिर्फ नकल कर रहा है।

संकलक if बयान की तरह चीजों को देखने और यह पता लगाने के लिए कि क्या वे हमेशा किसी दिए गए अभिव्यक्ति (== true, == false, == null, आदि) हो जाएगा कोशिश लेकिन यह केवल एक निश्चित स्तर तक इस अप करना होगा होगा।

true के मामले में कोई अस्पष्टता नहीं है: यह हमेशा निस्संदेह "सत्य" का प्रतिनिधित्व करेगा। हालांकि Boolean.TRUE सिर्फ एक फ़ील्ड है, जो स्पष्ट रूप से तब तक नहीं है जब तक संकलक जाने के इच्छुक नहीं है।

public static final Boolean TRUE = new Boolean(true); 

उदाहरण के लिए सोचें कि प्रतिबिंब शामिल होने पर क्या किया जाएगा।

आप इस स्पष्ट रूप से देख सकते हैं जब आप जटिलता के एक अतिरिक्त स्तर परिचय:

public static void main(String[] args) { 
    int x; 
    if(getCondition()) { 
     x = 5; 
    } 
    System.out.println(x); 
} 

private static boolean getCondition(){ 
    return true; 
} 

हालांकि अभिव्यक्ति हमेशा सच हो जाएगा, संकलक अभी भी शिकायत है कि x असाइन नहीं किए गए हो सकता है। आपकी मदद करने के लिए केवल सबसे प्राथमिक सत्यापन किया जाता है।

संबंधित मुद्दे