2012-02-19 9 views
14

मेरे पास एक वैरिएबल है जिसे प्रारंभ होने के बाद अपना मान बदलना नहीं है, इसलिए मैं इसे अंतिम चर के रूप में परिभाषित करना चाहता हूं।जावा: अंतिम चर को घोषित करने के लिए कैसे एक कोशिश-पकड़ ब्लॉक के अंदर शुरू किया गया है?

समस्या चर एक कोशिश ब्लॉक के अंदर प्रारंभ हो गया है, तो मैं निम्नलिखित मुसीबतों मिलता है जो:

मैं निम्नलिखित कोड है: यदि मैं अंतिम रूप variabale घोषित

Connection conn = null; 
try { 
    conn = getConn(prefix); 
    [...do some stuff with conn...] 
} catch (Exception e) { 
    throw new DbHelperException("error opening connection", e); 
} finally { 
    closeConnection(conn); 
} 

, इसे शून्य करने के लिए प्रारंभ किए बिना, मुझे अंत में ब्लॉक पर 'स्थानीय परिवर्तनीय कॉन प्रारंभ नहीं किया जा सकता है'। दूसरी तरफ, अगर मैं इसे अंतिम घोषित करता हूं और इसे शून्य में प्रारंभ करता हूं, तो मुझे त्रुटि मिलती है 'कोशिश करें कि अंतिम स्थानीय परिवर्तनीय कोन को ब्लॉक ब्लॉक में असाइन नहीं किया जा सकता है।

संपादित करें: LXX जवाब के बाद, मैं इस संस्करण

try { 
    final Connection conn = conn = getConn(prefix); 
    try { 
     return selectAll(conn, sql, params); 
    } catch (Exception e) { 
     throw new DbHelperException("error executing query", e); 
    } finally { 
     closeConnection(conn); 
    } 
} catch (Exception e) { 
    throw new DbHelperException("error opening connection", e); 
} 

के साथ आया था तो इस तरह से यह करने के लिए किया जाना चाहिए?

-

सबक सीखा:

मुझे लगता है कि सवाल का सही जवाब एक ही है कि दिया LXX है, लेकिन इस मामले में मुझे लगता है कि उस चर अंतिम outweights यह लाभ की घोषणा की विपक्ष ...

-

संपादित करें: मिला जब उपयोग करने के लिए के बारे में ढेर अतिप्रवाह पर दो सवाल अंतिम

When should one use final for method parameters and local variables?

Using "final" modifier whenever applicable in java

+0

आपके कोड में 'अंतिम कनेक्शन अंतिम कॉन = conn;' जोड़ने के बारे में कैसे? – biziclop

+0

आपको 'प्रयास' दोनों की आवश्यकता क्यों है? क्यों न केवल एक कोशिश है जिसमें आप कनेक्शन प्राप्त करते हैं और सभी का चयन करने के लिए इसका उपयोग करते हैं? – yshavit

+0

मैं सवाल करता हूं कि आपको क्यों लगता है कि इसे अंतिम रूप में घोषित करना इतना महत्वपूर्ण है। यह मेरे लिए नानी और नंगा लग रहा है। अगर मैं एक उपयोगकर्ता था, और मैंने कनेक्शन प्राप्त करने के लिए अपनी विधि बुलाई, तो मुझे कोई कारण नहीं दिख रहा कि मैं इसे बदलकर क्यों मकड़ना चाहता हूं। और अगर मैंने किया, तो मैं तर्क दूंगा कि परिणाम उपयोगकर्ता पर होना चाहिए। – duffymo

उत्तर

7

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

try { 
     final Connection conn = getConn(prefix); 
     try { 
      //code using conn 
     } catch (Exception e) { 

     } finally { 
      closeConnection(conn); 
     } 
    } catch (DbHelperException e) { 
     throw new DbHelperException("error opening connection", e); 
    } 
+3

+1, यह शायद सबसे साफ समाधान है। – biziclop

+0

हां, मुझे लगता है कि आपका क्या मतलब है, मुझे लगता है कि कनेक्शन खोलने का अपवाद है, तो कनेक्शन खोला नहीं जा सका, इसलिए इसे बंद करने की कोई आवश्यकता नहीं है। मैं कोड के एक और संस्करण के साथ आया, आपके उत्तर के लिए धन्यवाद, प्रश्न फिर से जांचें ... – opensas

+0

@ ओपेन्सस यदि 'getConn()' कॉल में कोई अपवाद है, तो वास्तव में कनेक्शन खोला गया था या नहीं, 'conn' निश्चित रूप से शून्य हो जाएगा, तो आप वैसे भी इसे बंद करने में सक्षम नहीं होंगे। – biziclop

-2

तुम दोनों को पकड़ने और अंत में ब्लॉक में बिना निर्दिष्ट कोशिश कर सकते हैं? तो जैसा:

Connection connTemp = null; 
final Connection conn; 
try { 
    connTemp = getConn(prefix); 
} catch (Exception e) { 
    throw new DbHelperException("error opening connection", e); 
} finally { 
    closeConnection(conn); 
} 
conn = connTemp; 
+0

जिसे अंतिम रूप में घोषित किया जा सकता है, कहीं भी बदला नहीं जा सकता है, इसका उद्देश्य –

+0

ने इसे एक अस्थायी चर का उपयोग करने के लिए अपडेट किया है। – AlexanderZ

-1

आप इसे अंतिम क्यों चाहते हैं? आप एक गुमनाम आंतरिक वर्ग के लिए इसे पारित करने के लिए चाहते हैं, तो आप कर सकता है:

Connection conn = null; 
try { 
    conn = getConn(prefix); 
    final Connection finalConn = conn; 
    // pass it to inner class here 
} catch (Exception e) { 
    throw new DbHelperException("error opening connection", e); 
} finally { 
    closeConnection(conn); 
} 

केवल समस्या (और काफी बड़ा एक) इस समाधान के साथ कि आप ही आपका कनेक्शन बंद के रूप में आप इस ब्लॉक छोड़ दें। तो जब तक कि आप अपने एनन आंतरिक कक्षा को तुरंत घोषित न करें और कॉल न करें, यह पैटर्न काम नहीं करेगा।

किसी भी तरह से, अगर मैं आप थे, तो शायद मैं पूरी चीज को फिर से भर दूंगा, इसके बजाय prefix अंतिम और एनन आंतरिक कक्षा में कनेक्शन हैंडलिंग का प्रतिनिधि बनूंगा।

+0

ओह! आप सही हैं, (बीटीडब्लू, आपने एक बुरा बग पकड़ा, धन्यवाद) - प्रश्न अपडेट किया गया ... – opensas

+2

और मैं इसे अंतिम रूप से परिभाषित करना चाहता हूं, बस संकलक को बताने के लिए कि वैरिएबल कॉन को प्रारंभ होने के बाद अपना मूल्य नहीं बदला जाना चाहिए ... – opensas

2

इस बारे में कैसे?

Connection temp = null; 
try { 
    temp = getConn(prefix); 
} catch (Exception e) { 
    throw new DbHelperException("error opening connection", e); 
} finally { 
    closeConnection(conn); 
} 
final Connection conn = temp; 
+0

आप आगे भी जा सकते हैं और अस्थायी रूप से वापस 'शून्य' सेट कर सकते हैं जिस तरह से आप इसका उपयोग नहीं करते हैं। – Michael

+4

यह पहले से बंद होने वाले कनेक्शन के लिए 'अंतिम' संदर्भ प्राप्त करने का एक अच्छा तरीका है। :) – biziclop

+1

@ माइकल ने JVM को इसे संभालने दें। –

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

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