आप निश्चित रूप से कोड के साथ तीन अलग-अलग ब्लॉक नहीं चाहते हैं। पहले ब्लॉक में, आप writer
को सेट करने में त्रुटि प्राप्त कर रहे हैं, लेकिन उसके बाद के बाद के ब्लॉक में writer
का उपयोग कर, जो पहली ब्लॉक विफल होने पर समझ में नहीं आता है। जब आप I/O त्रुटि — आदर्श नहीं होते हैं तो आप NullPointerException
फेंक देंगे। :-)
इस सामान में शैली के लिए बहुत सी जगह है, लेकिन यहां आपके कार्य की एक काफी मानक पुनरावृत्ति है। (हालांकि आप एक तिहाई वापस जोड़ने के लिए चुन सकते हैं; कोड में टिप्पणियां देखें) यह केवल दो ब्लॉकों का उपयोग करता है: finally
खंड पर
public void save(Object object, File file) {
BufferedWriter writter = null;
try {
writter = new BufferedWriter(new FileWriter(file));
Dictionary dictionary = (Dictionary)object;
ArrayList<Card> cardList = dictionary.getCardList();
for (Card card: cardList) {
String line = card.getForeignWord() + "/" + card.getNativeWord();
writter.write(line); // <== I removed the block around this, on
// the assumption that if writing one card fails,
// you want the whole operation to fail. If you
// just want to ignore it, you would put back
// the block.
}
writter.flush(); // <== This is unnecessary, `close` will flush
writter.close();
writter = null; // <== null `writter` when done with it, as a flag
} catch (IOException e) {
e.printStackTrace(); // <== Usually want to do something more useful with this
} finally {
// Handle the case where something failed that you *didn't* catch
if (writter != null) {
try {
writter.close();
writter = null;
} catch (Exception e2) {
}
}
}
}
नोट: यहाँ, आप सामान्य मामले से निपटने के किया जा सकता है (इस स्थिति में writter
null
होगा), या हो सकता है कि आप एक ऐसा अपवाद संभालें जो आपने नहीं पकड़ा था (जो असामान्य नहीं है, अपवादों के मुख्य बिंदुओं में से एक यह है कि इस स्तर पर उचित क्या है और कॉलर तक कुछ और पास करने के लिए) । यदि writter
!null
है, तो इसे बंद करें। और जब आप इसे बंद करते हैं, कोई अपवाद होता है या आप मूल को अस्पष्ट करेंगे। (मेरे पास वास्तव में इस स्थिति के लिए अपवाद खाने के दौरान चीजों को बंद करने के लिए उपयोगिता कार्य है। मेरे लिए, यह writter = Utils.silentClose(writter);
[silentClose
हमेशा null
] लौटा सकता है)। अब, इस कोड में आप अन्य अपवादों की अपेक्षा नहीं कर सकते हैं, लेकिन ए) आप इसे बाद में बदल सकते हैं, और बी) RuntimeException
एस किसी भी समय हो सकता है। पैटर्न का उपयोग करने के लिए उपयोग करने के लिए सबसे अच्छा है।
स्रोत
2010-11-14 12:14:19
इस तरह के अच्छे स्पष्टीकरण के लिए धन्यवाद। – Eugene
@AndroidNoob: कोई चिंता नहीं! खुशी हुई कि मदद की। –
@ टीजे। पाउडर आप 'try' ब्लॉक के अंदर 'लेखक' क्यों बंद करते हैं? क्या यह अनावश्यक नहीं है? –