2017-01-31 8 views
5

मैं समझता हूं कि जावा में एक लैम्ब्डा एक अपवाद अपवाद नहीं फेंक सकता है, लेकिन एक रनटाइम अपवाद फेंक सकता है, लेकिन नीचे दिए गए कोड को ब्रैकेट की आवश्यकता क्यों है?एक जावा लैम्ब्डा जो रनटाइम अपवाद को फेंकता है, को ब्रैकेट की आवश्यकता क्यों होती है?

Map<String, Integer> m = new HashMap<>(); 
Integer integer = m.computeIfAbsent("", s -> {throw new IllegalArgumentException("fail");}); 

आपके पास क्यों नहीं हो सकता है?

m.computeIfAbsent("", s -> throw new IllegalArgumentException("fail")); 

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

+4

मूल रूप से, 's-> expr' फ़ॉर्म केवल अभिव्यक्तियों के लिए काम करता है। 'फेंक 'एक बयान है। – ZhongYu

+0

आह, यह समझ में आता है, अगर आप इसे उत्तर में डालते हैं तो मैं इसे चिह्नित उत्तर – Ash

+2

के रूप में रखूंगा आप इसे [this] (http://stackoverflow.com/q/41482574/2711488) और [वह] भी पढ़ सकते हैं (http://stackoverflow.com/q/24146285/2711488)... – Holger

उत्तर

6

जावा भाषा विशिष्टता describes the body of a lambda expression

एक लैम्ब्डा शरीर या तो एक अभिव्यक्ति या एक ब्लॉक है (§14.2)।

लेकिन यह

throw new IllegalArgumentException("fail") 

throwstatement, नहीं एक अभिव्यक्ति है। इसलिए संकलक इसे लैम्ब्डा अभिव्यक्ति के शरीर के रूप में अस्वीकार करता है।

आप खरगोश छेद नीचे जा सकते हैं और सीख सकते हैं कि सभी प्रकार के भाव क्या हैं, here (व्याकरण का पालन करें)।

+0

+1। उलझन में पर्याप्त, जब आप एक लैम्ब्डा में एक अनवरोधित 'फेंक' कथन डालते हैं, तो 'जावैक' 'फेंक' पर त्रुटि 'अभिव्यक्ति की अवैध शुरुआत' देता है। –

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