2008-11-17 6 views
20

फेंक कभी नहीं कुछ दिन पहले मैंने महसूस किया कि PrintWriter (और साथ ही PrintStream) एक IOException, जब लेखन निस्तब्धता या समापन कभी नहीं फेंक देते हैं।PrintWriter और PrintStream IOExceptions

इसके बजाय यह एक त्रुटि होने पर आंतरिक ध्वज (trouble=true) सेट करता है।
सटीक अपवाद प्राप्त करना संभव नहीं है, लेकिन यदि कुछ अपवाद (checkError()) था।

मेरा सवाल है: क्यों कोई ऐसा व्यवहार करना चाहता है? क्या वह बुरा एपीआई डिज़ाइन नहीं है?

+2

मैं बस इसे देख रहा था। मैंने इसे वास्तव में भी अजीब पाया। अपवाद को छिपाना एक बात है, लेकिन इसे पूरी तरह से छोड़ना है? अगर मैं वास्तव में अपवाद की सामग्री जानना चाहता हूं तो क्या होगा? मुझे एक getError() विधि की उम्मीद है लेकिन ... यह वास्तव में एक अजीब डिजाइन निर्णय है। – aberrant80

उत्तर

9

मुझे लगता है कि System.out और System.errPrintStream के उदाहरण हैं, कुछ और आराम से त्रुटि प्रबंधन प्रदान किया गया था। यह संभवतः, जैसा कि अन्य पोस्टर ने उल्लेख किया है, 1 99 5 के आसपास सी/सी ++ से संक्रमण करने वालों के लिए रास्ता सुगम बनाने के लिए। जब ​​रीडर/राइटर एपीआई जोड़ा गया था, PrintWriter मौजूदा PrintStream समानांतर के लिए बनाया गया था।

एक ऐसा एप्लिकेशन जहां यह व्यवहार बेहद वांछनीय है लॉगिंग है। लॉगिंग एक बड़े आवेदन के लिए सहायक है। आम तौर पर, अगर लॉगिंग विफल हो जाती है, तो कोई नहीं चाहता कि पूरा एप्लिकेशन असफल हो। इस प्रकार, अपवादों को अनदेखा करने के लिए, कम से कम System.err के लिए यह समझ में आता है।

1

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

0

यह संभव है कि सी पृष्ठभूमि से आने वाले किसी व्यक्ति द्वारा डिज़ाइन किया गया था जहां एक ही फैशन में stdio त्रुटियों को संभाला जाता है। चूंकि मुझे उस प्रतिमान के लिए उपयोग किया जाता है, इसलिए मैं इसे बुरा नहीं कहूंगा, लेकिन मैं सहमत हूं कि यह असंगत है।

मैं प्रिंटवाइटर को उपयोग करने में आसान बनाने की कोशिश करने के बारे में टिप्पणी से भी सहमत हूं। जावा में आईओ कक्षाएं उलझन में हैं (कम से कम मुझे पता है कि हर किसी के लिए) और शायद कोई व्यक्ति जीवन को थोड़ा आसान बनाने की कोशिश कर रहा था।

6

मुझे आश्चर्य है कि अगर इसकी वजह से IOExceptions की जांच की जाती है, तो आपको प्रत्येक System.out के आस-पास एक पकड़ पकड़ने की आवश्यकता होगी। कहते हैं।

अपडेट: या आपके विधि हस्ताक्षर में फेंकता है।

यह बहुत जल्दी परेशान होगा।

+0

एक चेक अपवाद को निश्चित रूप से एक कोशिश-पकड़ ब्लॉक की आवश्यकता नहीं है। प्रिंटस्ट्रीम का उत्पादन उत्पादन कोड में शायद ही कभी किया जाता है, और मूल पुस्तकालयों के भीतर इसका उपयोग लॉगिंग तक सीमित है, जहां विफलताओं को सुरक्षित रूप से अनदेखा किया जा सकता है। – erickson

+0

वे अभी भी एक आंतरिक ध्वज स्थापित करने के बजाय IOException की बजाय रनटाइम अपवाद फेंक सकते हैं। –

0

सूर्य/ओरेकल ने दो लिखने वाले कार्यों को जोड़ा होगा, जो एक IOException फेंकता है और दूसरा जो कुछ भी नहीं फेंकता है।

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