2013-08-08 13 views
6

यदि जावा सी नल मानों तक पहुंचने का प्रयास करता है तो जावा अक्सर नल पॉइंटर अपवाद क्यों फेंकता है जबकि उद्देश्य सी नहीं करता है?शून्य बनाम अपवाद के मामले में जावा बनाम उद्देश्य सी

जावा:

public class SubscribeEmailActivity { 
    String status; 

    public static void main(String[] args){ 

     if(Status.equals(null)||status.equals(""){ 

      // i am getting error here 

     } 
    } 

} 

उद्देश्य सी:

//in .h file 
NSString *exp; 

//in .m file 
if ([exp isEqualToString:NULL] ||[exp isEqualToString:@""]) 
{ 
    // i am not getting any error 
} 
+9

क्योंकि वे अलग-अलग भाषाएं हैं? 'शून्य' पर कॉलिंग विधियों को कैसे संभालना है इस पर कोई पूर्ण नियम नहीं है। यह विभिन्न कारणों से बनाई गई भाषा के डेवलपर्स का निर्णय है। – DrummerB

+0

मुझे एक ही संदेह है – ArunMak

+4

मुझे उद्देश्य-सी पता नहीं है, लेकिन [exp isEqualToString: NULL] मुझे शून्य के लिए चेक की तरह नहीं लगता है, बल्कि "न्यूल" के लिए एक चेक और आपकी जावा की जांच शून्य से नहीं है । –

उत्तर

6

अंत में, पूरी तरह से इस समस्या को हल करने का एकमात्र तरीका एक अलग प्रोग्रामिंग भाषा के उपयोग के द्वारा होता है:

  • ऑब्जेक्टिव-सी में, आप शून्य पर एक विधि लागू के बराबर कर सकते हैं, और पूरी तरह से कुछ नहीं होगा । इससे सबसे अधिक शून्य अनावश्यक जांच करता है लेकिन निदान के लिए त्रुटियों को बहुत कठिन बना सकता है।
  • नाइस में, जावा-व्युत्पन्न भाषा, सभी प्रकार के दो संस्करण हैं: संभावित रूप से शून्य संस्करण और एक शून्य संस्करण। आप केवल नल प्रकारों पर विधियों का आह्वान कर सकते हैं। संभावित रूप से शून्य प्रकारों को शून्य के लिए स्पष्ट जांच के माध्यम से गैर-शून्य प्रकारों में परिवर्तित किया जा सकता है। इससे यह जानना बहुत आसान हो जाता है कि शून्य चेक आवश्यक हैं और जहां वे नहीं हैं।

    Status status = null; 
    if("".equals(status)){ 
        //.... 
    } 
    

    :

7

समस्या जावा में अपने मूल्यांकन में है, यह होना चाहिए:

if(status == null||status.equals("")) { 
    //Do not try to dereference status.... 

यह है कि यह केवल ध्यान दिया जाना चाहिए काम करता है क्योंकि जावा, और अन्य भाषाओं, तार्किक मूल्यांकन में कम कटौती की अनुमति देता है। इस मामले में कुछ सरल बूलीय बीजगणित:

true || ??? => true 

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

इसके अतिरिक्त आप अपाचे कॉमन्स isEmpty() या अपना खुद रोल कर सकते हैं:

public static final boolean isEmpty(String arg0) { 
    if(arg0 == null) return true; 
    if(arg0.trim().length() < 1) return true; 
    return false; 
} 

संस्करण दिखाया अपाचे कॉमन्स में isBlank लिए समान है।

+0

status.equals ("") को status.isEmpty() – Carnal

+0

असल में आप दोनों कॉलों से बच सकते हैं। "असमान (स्थिति)'। इस तरह '.equals()' विधि * को शून्य ऑब्जेक्ट पर कभी नहीं बुलाया जाएगा, और साथ ही आप परीक्षण कर रहे हैं यदि स्ट्रिंग खाली है, तो 'स्थिति' शून्य नहीं है। – tomacco

2

तो चर status जावा में null है, तो कॉल करने के लिए status.equals() एक NullPointer अपवाद फेंक जाएगा कोशिश कर रहा। isEqualToString उद्देश्य-सी तारों का सदस्य फ़ंक्शन नहीं है, यह बस एक स्ट्रिंग और ऑब्जेक्ट की तुलना करता है।

+1

isEqualToString: (कोलन महत्वपूर्ण है) वर्ग एनएसएसटींग का एक तरीका है। वास्तव में अंतर को समझाने के लिए – Fred

4

यह शायद आपके प्रश्न का उत्तर नहीं है, लेकिन एक नियम एक नल पॉइंटर एक्सेप्शन से बचने के लिए, और एक ही समय में एक अशक्त जांच से बचने के लिए इस तरह की जांच व्युत्क्रम है जो झूठी वापसी करेगा।

का उपयोग करते समय:

if(status.equals("")){ 
} 

एक एनपीई अपवाद फेंक देते हैं।

+0

+1 – Carnal

2

यह सिर्फ एक बात है कि भाषा को कैसे डिजाइन किया गया है। अगर आप बहादुर हैं, तो आप here देख सकते हैं, यह देखने के लिए कि objc_msgSend कैसे काम करता है और आप ऑब्जेक्ट्स को संदेश क्यों भेज सकते हैं।

4

उद्देश्य सी विधि कॉल में संदेश भेजने के बराबर माना जाता है, और nil पर कोई संदेश भेजने से कुछ भी नहीं होता है। इसका मतलब है कि आपको जावा में आवश्यक नल-चेक लिखने की ज़रूरत नहीं है, जो प्रोग्रामर के लिए अधिक सुविधाजनक है जो अधिक कॉम्पैक्ट कोड लिख सकते हैं।

दूसरी ओर, यह भी त्रुटि का एक स्रोत हो सकता है: यदि आप एक वास्तविक वस्तु को एक संदेश भेज लेकिन इसके बजाय, उद्देश्य सी में आप एक चेतावनी नहीं मिलेगा nil को भेजने के लिए उम्मीद कर रहे थे। जावा में यह ऑपरेशन NullPointerException फेंकने का कारण बनता है, जिससे यह स्पष्ट हो जाता है कि आपके पास एक बग है।

चूंकि भाषा डिजाइनरों को सुविधा और सुरक्षा के बीच एक व्यापार करना है, न तो विकल्प निष्पक्ष रूप से बेहतर है। ऑब्जेक्टिव सी के डिजाइनरों ने फैसला किया कि ब्लैक होल के रूप में nil को कार्यान्वित करना बेहतर है: यह आपके द्वारा फेंकने वाली किसी भी चीज को निगलता है। जावा के डिजाइनरों ने फैसला किया कि null से निपटने पर एक बेहतर त्रुटि उत्पन्न होने पर यह बेहतर होगा। वास्तव में इसके लिए और कुछ नहीं।

2

अपने कोड

if(Status.equals(null)||status.equals("") में आप null करने के लिए एक स्ट्रिंग (शून्य एक स्ट्रिंग नहीं है) की तुलना कर रहे हैं।

स्ट्रिंग से गैर-स्ट्रिंग की तुलना करना संभव नहीं है। आईओएस कोडिंग के मामले में मेरा मानना ​​है कि

[exp isEqualToString:NULL]

कुछ भी नहीं करने के लिए तर्क धर्मान्तरित के रूप में शून्य या शून्य ही कर रहे हैं और फिर यह तुलना, इसलिए यह काम करता है।

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