7

चूंकि ByteArrayOutputStream बस स्मृति को लिखता है, IOException कभी नहीं होना चाहिए। हालांकि, OutputStream इंटरफ़ेस के अनुबंध की वजह से, सभी स्ट्रीम ऑपरेशंस IOException को उनके throws खंड में परिभाषित करते हैं।जावा: IOException जब एक ByteArrayOutputStream को लिखते हैं?

यह कभी भी होने वाली IOException "संभाल" करने का सही तरीका क्या है? बस एक खाली try-catch ब्लॉक में संचालन लपेटें?

या क्या कोई वास्तविक परिस्थितियां हैं जहां ByteArrayOutputStream अपवाद फेंक सकता है?

(यह भी देखें: How can I handle an IOException which I know can never be thrown, in a safe and readable manner?)

संपादित

जॉन बताते हैं के रूप में, ByteArrayOutputStreamwrite तरीकों में परिभाषित करता है पर एक throws खंड की घोषणा नहीं करता - हालांकि, यह OutputStream से write(byte[]) इनहेरिट करती है, और वह IOEXception फेंक देता है (काफी विचित्र है कि BAOS इस विधि को ओवरराइड नहीं करेगा, क्योंकि यह सुपरक्लास संस्करण को प्रतिस्थापित कर सकता है - जो एक समय में एक बाइट लिखता है - एक बहुत अधिक कुशल arraycopy कॉल के साथ)

उत्तर

9

खैर, ByteArrayOutputStreamकी घोषणा नहीं है कि अपने से किसी भी विधि writeTo और close छोड़कर IOException फेंक देते हैं। (मुझे नहीं पता कि close अभी भी ईमानदार होने के लिए इसे घोषित करता है।)

यदि आपको OutputStream टाइप का संदर्भ मिला है, तो भी आप निश्चित रूप से उस से घोषणाओं को फेंक देंगे।

मैं एक खाली कैच ब्लॉक का प्रयोग करेंगे नहीं - मैं IllegalStateException या किसी ऐसे ही अनियंत्रित अपवाद की तरह कुछ फेंक चाहते हैं: यह मतलब है कि आप एक स्थिति आप वास्तव में की उम्मीद नहीं है में हैं, और कुछ बुरी तरह गलत हो गया है।

+0

'पास पर IOException() अपने कोड संयोजित करते समय' एक गलती किया जाना चाहिए - खासकर जब जावाडोक यह कहते हैं, " इसका कोई प्रभाव नहीं है " – irreputable

+0

+1 धन्यवाद! मैंने अभी देखा है कि 'ByteArrayOutputStream.write' वास्तव में' IOException' घोषित नहीं करता है - लेकिन जब भी मैं इसका उपयोग करता हूं तब ग्रहण एक अनचाहे अपवाद के बारे में शिकायत करता है ... अजीब। –

+0

@ जेन: क्या आप वाकई एक चर * घोषित * पर 'बाइटएरे ऑटपुटस्ट्रीम' के रूप में कॉल कर रहे हैं? –

1

कैच ब्लॉक में throw new RuntimeException(theIOException) पर एक विशिष्ट क्लिच है। यदि असंभव होता है, तो आप कम से कम इसके बारे में पता लगाते हैं।

1

अपवाद श्रृंखला इस स्थिति में सबसे अच्छा अभ्यास है। यानी एक रनटाइम अपवाद फेंक दो।

2

मैंने अभी देखा है कि ByteArrayOutputStream.write वास्तव में IOException घोषित नहीं करता है - लेकिन ग्रहण जब भी मैं इसका उपयोग करता हूं तो एक अनचाहे अपवाद के बारे में शिकायत करता है ... अजीब।

यह समझाना आसान है। आप शायद कुछ इस तरह किया है:

OutputStream os = new ByteArrayOutputStream(); 
    ... 
    os.write(); 

"समस्या" है कि आप OutputStream.write() बजाय ByteArrayOutputStream.write() के रूप में के रूप में विधि बुला रहे हैं है। तो संकलक का कहना है:

"आह ... write() एक OutputStream पर एक IOException है, तो आप इसके साथ सौदा होगा फेंक कर सकते हैं।"

यह नहीं कह सकता:

" यह विशेष रूप से OutputStream वास्तव में एक ByteArrayOutputStream है ... इसलिए हम आप से दूर दूँगा "

क्योंकि JLS अनुमति नहीं है। यह

यह उन किनारे के मामलों में से एक है जहां कार्यान्वयन वर्ग की बजाय इंटरफ़ेस को कोडिंग करके "सर्वोत्तम अभ्यास" का पालन करने के बाद आपको वापस काटने के लिए आता है।

ठीक तो ...

  • इसकी एक सौम्य निप, नहीं एक पूर्ण पर काटने।
  • OutputStream जावा क्लास के रूप में लागू किया गया है जो जावा इंटरफेस नहीं है, लेकिन यह बिंदु के बगल में है।
  • सबसे compilers वास्तव में आप के साथ बातचीत पकड़ नहीं है :-)

+0

सामान्य में आप सही हैं। हालांकि 'ByteArrayOutputStream' अनजाने में' बंद() 'कुछ भी नहीं कर रहा है और 'IOException' फेंक रहा है, इसलिए इस मामले में संदर्भ प्रकार कोई फर्क नहीं पड़ता (OpenJDK)। – musiKk

+0

धन्यवाद, महान स्पष्टीकरण। मुझे पता चला कि क्या हो रहा है। मैं 'ByteArrayOutputStream' के उप-वर्ग के भीतर से 'लिखना (बाइट [])' कह रहा हूं। 'बीओओएस 'इस विधि को ओवरराइड नहीं करता है, इसलिए मैं वास्तव में' आउटपुटस्ट्रीम 'में परिभाषित विधि (जो' आईओई 'फेंकता है) –

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