2011-03-29 6 views
9

मेरे पास यह टेस्ट कोड है:मुझे इस मामले में ग्रोवी में नलपोइंटर अपवाद क्यों नहीं मिला?

def test = null 

test.each { } 

मुझे कोई अपवाद क्यों नहीं मिला?

+0

संबंधित यहाँ questiuon: http : //stackoverflow.com/questions/2480195/what-is-the-purpose-of-the-nullobject-class-in-groovy –

+0

@tim_yates संबंधित प्रश्न – res1

उत्तर

9

each के कार्यान्वयन यह लक्ष्य है की एक अशक्त-सुरक्षित फैशन में iterator विधि कॉल करने की कोशिश करता है। यदि each को शून्य ऑब्जेक्ट या iterator विधि के बिना ऑब्जेक्ट पर कॉल किया जाता है, तो कुछ भी नहीं होता है।

मैं स्रोत कोड नहीं देखा है, लेकिन यह this§

Object each(Closure closure) { 

    if (this?.respondsTo("iterator")) { 

    def iterator = this.iterator() 

    while (iterator.hasNext() { 
     def item = iterator.next() 
     closure(item) 
    } 
    } 
    return this 
} 

§ हकीकत में कुछ ऐसा दिखाई दे सकता है, इस विधि शायद जावा के बजाय ग्रूवी में लिखा है

+5

के लिंक के लिए धन्यवाद वास्तव में, यह 'org.codehaus में है .groovy.runtime.NullObject.java', जहां 'सार्वजनिक इटरेटर इटरेटर() {वापसी संग्रह .EMPTY_LIST.iterator() के रूप में परिभाषित एक विधि है; } 'तो' प्रत्येक ' –

+0

@tim_yates धन्यवाद द्वारा पूछे जाने पर 'NullObject' (' null') एक' Iterator' को रिक्त 'सूची' पर लौटाता है, लेकिन मैं अपना कार्यान्वयन पसंद करता हूं :) –

+0

हे, आपकी कल्पना दुनिया का आनंद लेना एह? ;-) –

2

प्रत्येक बंद करने का उपयोग करते समय एक शून्य मान 0 तत्वों के साथ संग्रह के समान होता है। यदि आपके पास कोड

def test=null 
test.each {println "In closure with value "+it} 

प्रिंट स्टेटमेंट निष्पादित नहीं होगा। यदि आप परीक्षण को

def test=[1,2,3] 

पर आउटपुट प्राप्त करेंगे।

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