2015-06-12 9 views
5

मेरे परियोजना निम्नलिखित की तरह कोड है:श्रृंखलन अशक्त-सुरक्षित ऑपरेटर

params.stringValue?.trim().replaceAll('aa', 'a') 

हम उम्मीद है कि अगर params.stringValue अशक्त था, कि दोनोंtrim() और replaceAll() बुलाया नहीं किया जाएगा।

हालांकि हमें इस पंक्ति पर NullPointerException मिल रहा था और कहा कि replaceAll() को शून्य ऑब्जेक्ट पर नहीं कहा जा सकता है।

params.stringValue?.trim()?.replaceAll('aa', 'a') 

ऊपर पहले कोड स्निपेट क्यों काम नहीं करता:

हम कोड बदलना पड़ा इस तरह होना करने के लिए? क्या यह ग्रोवी में एक बग है कि एक बार एक नल का सामना करने के बाद अभिव्यक्ति का मूल्यांकन करना जारी रहता है?

+0

मुझे लगता है कि यह एक बग (!) की बजाय "फीचर" है – Armand

उत्तर

4

यह रास्ता ग्रूवी काम करता है, वास्तव में, और others काट लिया है है??।

println पुस्तक .author .firstName .trim() concat ("महान है।")

...

कोड की इस पंक्ति को देखते हुए, मैंने सोचा कि मैं किसी भी स्नीकी NullPointerException से सुरक्षित था। यदि पुस्तक, लेखक या प्रथम नाम शून्य हैं तो मैं बस प्रिंटिंग शून्य को समाप्त कर दूंगा और concat() विधि के बारे में चिंता करने की ज़रूरत नहीं है। आखिरकार, अगर ट्रिम() विधि सफल हो जाती है, तो इसके नतीजे के परिणाम की रक्षा करने में कोई समझ नहीं है। और यही वह जगह है जहां मैं गलत था।

किया गया है कम से कम this discussion कि बदलने के लिए:

एक .b.c // आप त्रुटि देखते हैं? ;)

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

एक? .b? .e.f?। // // टाइप करना भूल गए हैं? ? .n "f" संपत्ति एक

.befg

ग्रूवी इस तरह एक असली अशक्त-सुरक्षित अभिव्यक्ति के साथ इसे ठीक कर सकता है???

एक .b करें.ई. करें.एफ़ .g

8

मुझे नहीं लगता कि आपकी धारणा सही थी।इस:

params.stringValue?.trim().replaceAll('aa', 'a') 

मतलब यह नहीं है:

if(params.stringValue is null) 
    dont proceed to trim() and replaceAll() 

यह बल्कि अर्थ है:

params.stringValue?.trim()?.replaceAll('aa', 'a') 

यह दोनों trim() छोड़ सकते हैं और करेंगे:

if(params.stringValue is null) 
    skip trim() without complain but pass null to replaceAll() 

ताकि आप कहने की जरूरत है replaceAll() यदि आने वाला तर्क शून्य है।

8

आपकी धारणा केवल आंशिक रूप से सही है।

? -operator अशक्त के मामले में निष्पादन को तोड़ने नहीं है, यह वर्तमान पद्धति बुला ब्लॉक, और एक null रिटर्न के बजाय, जिसके कारण यह ? साथ श्रृंखला के दाएँ हाथ की ओर की रक्षा के लिए भी आवश्यक है

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