2010-03-23 12 views
5

मैं कोड की निम्न 3 लाइनों:यदि IOException फेंक दिया गया है तो मुझे क्या करना चाहिए?

ServerSocket listeningSocket = new ServerSocket(earPort); 
Socket serverSideSocket = listeningSocket.accept(); 
BufferedReader in = new BufferedReader(new InputStreamReader(serverSideSocket.getInputStream())); 

संकलक इन 3 लाइनों के सभी शिकायत के बारे में और उसके शिकायत सभी 3 लाइनों के लिए एक ही है: असूचित अपवाद java.io.IOException; अधिक जानकारी में, इन अपवादों को new ServerSocket, accept() और getInputStream() द्वारा फेंक दिया गया है।

मुझे पता है कि मुझे try ... catch ... का उपयोग करने की आवश्यकता है। लेकिन इसके लिए मुझे यह जानने की जरूरत है कि प्रत्येक विशेष मामले में इन अपवादों का क्या अर्थ है (मुझे उन्हें कैसे समझना चाहिए)। जब वे होते हैं? मेरा मतलब है, सामान्य रूप से नहीं, लेकिन इन 3 विशेष मामलों में।

उत्तर

5

आप विशेष रूप से नहीं जानते क्योंकि आईओ अपवाद भी एक "सामान्य" अपवाद है जो तकनीकी रूप से कई कारणों से हो सकता है। इसका मतलब इनपुट/आउटपुट के आसपास एक अप्रत्याशित मुद्दा हुआ, लेकिन जाहिर है कि इंटरनेट पर स्थानीय हार्ड डिस्क पर इसका अलग-अलग कारण हैं।

सामान्यतः, सभी तीन आइटम सॉकेट के आसपास हल होते हैं। तो कारण नेटवर्क मुद्दों से संबंधित हैं। संभावित हैं:

  • कोई नेटवर्क बिल्कुल नहीं, स्थानीयहोस्ट भी नहीं (एक गंभीर तकनीकी समस्या होगी)।
  • पोर्ट पहले से उपयोग में है, जब एक पोर्ट नंबर दिया जाता है (नया सर्वर सॉकेट (कानपोर्ट)
  • नेटवर्क समस्याएं - उदाहरण के लिए कुछ सामान के दौरान केबल पर somseone ठोकर खाई। खराब गुणवत्ता का कारण भी हो सकता है, एक डीडीओएस हमला आदि
  • पोर्ट थकावट - कोई नया कनेक्शन के लिए क्लाइंट साइड पोर्ट उपलब्ध नहीं है।

मूल रूप से इस पंक्ति के आसपास।

वही होगा या जब भी आप वास्तव में धाराओं के साथ कुछ करते हैं तो ऐसा ही हो सकता है।

  • पहली पंक्ति:: सॉकेट से प्रयोग में है (कार्यक्रम 2 बार, अन्य कार्यक्रम के रूप में ही बंदरगाह शुरू कर दिया)

    थी scase में आप दो संभावित मुख्य कारण ahve। यह स्पष्ट रूप से गैर-निर्धारण योग्य है जब तक कि उपयोगकर्ता कुछ नहीं करता।

  • जेनेरिक बाद में रनटाइम त्रुटि। ये सामान्य परिचालन के दौरान हो सकता है।
+0

+1 यह उत्तर का मूल है। क्या गलत हो सकता है इसके बारे में सोचें। एपीआई आपको बता रहा है कि यह हमेशा आपके नियंत्रण से परे कारणों के लिए काम नहीं करेगा। आप उस त्रुटि की स्थिति को कैसे संभालना चाहते हैं? एक बार जब आप उस प्रश्न का उत्तर जान लेंगे, तो आपको पता चलेगा कि आप कंपाइलर को संतुष्ट करने के लिए क्या करना चाहते हैं। – Yishai

1

सबसे आसान तरीका है अपने बुला प्रणाली की घोषणा करने के लिए IOException फेंकने के लिए है, लेकिन आप finally खंड में सफाई आबंटित संसाधनों की जरूरत है इससे पहले कि आप अपने विधि छोड़: सामान्य में

public void doSession () throws IOException 
{ 
    final ServerSocket listeningSocket = new ServerSocket(earPort); 

    try 
    { 
    final Socket serverSideSocket = listeningSocket.accept(); 

    try 
    { 
     final BufferedReader in = 
     new BufferedReader(
      new InputStreamReader(
      serverSideSocket.getInputStream() 
     ) 
     ); 
    } 
    finally 
    { 
     serverSideSocket.close() 
    } 
    } 
    finally 
    { 
    listeningSocket.close() 
    } 
} 
1

यह वास्तव में कोई फर्क नहीं पड़ता प्रारंभिक IOException के कारण क्या हुआ क्योंकि स्थिति को सही करने के लिए आपका ऐप बहुत कम कर सकता है।

हालांकि, "क्या करना है" के आपके प्रश्न के सामान्य उत्तर के रूप में आपके पास कुछ विकल्प हैं। मई काम करता है, तो समस्या रुक-रुक कर रहा था -

  • फिर की कोशिश करो। यदि ऐसा नहीं होता है तो ब्रेक स्थिति की आपूर्ति करना याद रखें।
  • कुछ और कोशिश करें - संसाधन को किसी दूसरे स्थान से या किसी भिन्न विधि से लोड करें।
  • दें - अपवाद को फेंक दें// या कार्रवाई या शायद पूरे कार्यक्रम को निरस्त करें। आप इस बिंदु पर एक उपयोगकर्ता के अनुकूल संदेश प्रदान करना चाह सकते हैं ... ;-) यदि आपका प्रोग्राम को फ़ंक्शन के लिए इनपुट की आवश्यकता है तो इनपुट में आपको थोड़ा विकल्प नहीं छोड़ता है लेकिन कार्य नहीं करता है।
संबंधित मुद्दे