कोशिश करें मैं एक कोशिश ब्लॉक में परिवर्तनीय दायरे के बारे में नियम से नाखुश हूं, जो संबंधित पकड़ और आखिरकार ब्लॉक के साथ साझा नहीं किया जा रहा है। विशेष रूप से वह ऐसा कोड की ओर जाता है:ब्लॉक स्कोप
var v: VType = null
try {
v = new VType()
}
catch {
case e => // handle VType constructor failure (can reference v)
}
finally {
// can reference v.
}
के रूप में करने का विरोध किया:
try {
val v = new VType()
}
catch {
case e => // handle VType constructor failure (can reference v)
}
finally {
// can reference v.
}
किसी को समझाने या औचित्य साबित क्यों जावा से इस नियम बनी रहती है सकते हैं?
और/या उम्मीद है कि यह बदल सकता है?
धन्यवाद!
अद्यतन
तारीख करने के लिए सभी प्रतिक्रिया के लिए बहुत धन्यवाद।
सर्वसम्मति से संकेत मिलता है कि "बस इसके साथ आगे बढ़ें" और मैं यह निष्कर्ष निकालना शुरू कर रहा हूं कि शायद तकनीकी रूप से जो मैं चाहता हूं वह या तो असफल है, प्रयास करने के लिए या कठिन नहीं है।
मुझे रेक्स केर का जवाब पसंद है लेकिन उपरोक्त मूल कोड विधि विधि में स्थानीय var को पेश किए बिना विधि कॉल में कैसे लपेटा जाएगा?
मेरे स्वयं के प्रयास बहुत ही अच्छे नहीं थे, निर्माण नाम में सुरक्षित रूप से निर्माण तक देरी के लिए एक उप-पैरामीटर पैरामीटर का उपयोग करके, लेकिन अभी भी मुझे कैच में निर्मित (या नहीं) ऑब्जेक्ट तक पहुंच नहीं देता है ब्लॉक।
अच्छा सवाल। ऐसा लगता है कि आपको 'var' पेश करना है और आप 'try-catch-finally'-block में 'val' का उपयोग नहीं कर सकते हैं, जहां आपको कुछ संसाधनों को साफ़ करने की आवश्यकता है या जो भी हो। –
ऐसा लगता है कि कैच स्टेटमेंट द्वारा डिज़ाइन आदर्श के लिए नहीं बनाता है ... कैच स्टेटमेंट में परिभाषित ऑब्जेक्ट उत्पन्न करना आदर्श है क्योंकि यह एक तेज प्रक्रिया है और असफल नेटवर्क अनुरोध आदि से त्वरित पुनर्प्राप्ति प्रदान करता है। – Alex
चाहते हैं एक नोट बनाओ, कि यदि VType कन्स्ट्रक्टर विफल हुआ है तो आप v वैरिएबल को स्पर्श नहीं करना चाहते हैं, जब तक कि आप एक बड़ी खाली नल देखना न चाहें। scala.util.control.Exception – jsuereth