2010-04-13 12 views
6

मैं कोशिश-पकड़ लूप के साथ नीचे दिए गए अपवाद को "ठीक" कर सकता हूं लेकिन मैं कारण समझ नहीं पा रहा हूं।जावा: BufferedReader के readLine() में IOEXceptions क्या हैं?

  1. "in.readLine()" भाग लगातार IOExceptions को क्यों उत्तेजित करता है?
  2. वास्तव में ऐसे अपवादों को फेंकने का उद्देश्य क्या है, लक्ष्य शायद अधिक दुष्प्रभाव नहीं है?

कोड और IOExceptions

$ javac ReadLineTest.java 
ReadLineTest.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown 
    while((s=in.readLine())!=null){ 
        ^
1 error 
$ cat ReadLineTest.java 
import java.io.*; 
import java.util.*; 

public class ReadLineTest { 
public static void main(String[] args) { 
    String s; 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
    // WHY IOException here? 
    while((s=in.readLine())!=null){ 
    System.out.println(s); 
    } 
} 
} 
+2

सूर्य अपवाद ट्यूटोरियल: http://java.sun.com/docs/books/tutorial/essential/exceptions/index.html – BalusC

उत्तर

7

मूल विचार यह है कि एक BufferedReader एक अलग प्रकार के पाठक को प्रतिनिधि करता है, इसलिए यह उस अपवाद पर गुज़र रहा है।

फ़ाइल रीडर के मामले में फ़ाइल सिस्टम कहने के लिए, विभिन्न प्रकार के रीडर किसी प्रकार के अस्थिर बाहरी संसाधन से पढ़ सकते हैं। एक फ़ाइल सिस्टम पढ़ी किसी भी समय कई कारणों से विफल हो सकती है। (यदि रीडर को नेटवर्क स्ट्रीम से अंतर्निहित डेटा मिल रहा है तो स्थिति खराब होती है)। फ़ाइल आपके नीचे से हटा दी जा सकती है (फ़ाइल सिस्टम और ओएस शामिल के आधार पर)।

क्योंकि आप भविष्यवाणी नहीं कर सकते कि कोड के साथ क्या होगा, आपको एक चेक अपवाद मिलता है - यह मुद्दा यह है कि एपीआई आपको बता रही है कि आपको इस तथ्य के बारे में सोचना चाहिए कि यह ऑपरेशन काम नहीं कर सकता है, भले ही इसमें कुछ भी गलत न हो तुम्हारा कोड।

1

IOException एक checked exception है। आपको या तो इसे पकड़ना होगा, या इसे अपनी कॉलिंग विधि पर फेंक देना होगा। चेक किए गए अपवाद बाहरी अभिनेताओं के कारण होते हैं, जैसे लापता फ़ाइल, विफल डिस्क या कुछ भी जो आप अपने प्रोग्राम कोड से पुनर्प्राप्त नहीं कर सकते हैं।

हालांकि, एक अनचेक अपवाद जैसे ArrayIndexOutofBoundsException प्रोग्राम में दोषपूर्ण तर्क के कारण होता है। आप इसे अपने दोषपूर्ण कोड के बाहर एक शर्त का उपयोग करके इसे घटा सकते हैं (जैसे currIndex> array.length)। चेक अपवाद

1

के मामले में ऐसा कोई प्रावधान नहीं है यदि आई/ओ के साथ असाधारण स्थिति होती है, उदाहरण के लिए स्ट्रीम का स्रोत अब उपलब्ध नहीं है।

ऐसे मामलों में आपका प्रोग्राम पुनर्प्राप्त करने में सक्षम होना चाहिए। या तो स्रोत को फिर से पढ़कर, या कुछ डिफ़ॉल्ट का उपयोग करके, या समस्या के बारे में उपयोगकर्ता को चेतावनी देकर।

आपको catch पर मजबूर होना पड़ता है, क्योंकि यह एक चेक अपवाद है, और आप उनसे पुनर्प्राप्त करने में सक्षम होना चाहिए।

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

+2

@downvoter - मुझे इस जवाब के साथ गलत लगता है कि मुझे ठीक करने दें। – Bozho

2

BufferedReader.readLine() घोषित किया जाता है संभवतः एक अपवाद फेंकने के रूप में, देखें: http://java.sun.com/j2se/1.3/docs/api/java/io/BufferedReader.html#readLine()

आप या तो इसे पकड़ने, या IOException फेंकने के रूप में अपने मुख्य प्रणाली की घोषणा की जरूरत है।

Ie, या तो ऐसा करते हैं:

try { 
    while((s=in.readLine()) != null){ 
     System.out.println(s); 
    } 
} catch(IOException e) { 
    // Code to handle the exception. 
} 

या

public static void main(String[] args) throws IOException { ... 
3
  1. यह "लगातार प्रज्वलित" नहीं होगा उन्हें, यह सिर्फ उन्हें हर बार जब आप यह आह्वान फेंक सकता है। आपके मामले में, अगर यह कुछ फेंकता है तो इसका मतलब है कि आपके मानक इनपुट में कुछ गलत हो गया है।
  2. लक्ष्य यह सुनिश्चित करना है कि आप, एपीआई का उपयोग करने वाले प्रोग्रामर समस्या से निपटते हैं, क्योंकि इसे आम तौर पर एक पुनर्प्राप्त करने योग्य समस्या माना जाता है - हालांकि आपके विशेष मामले में यह आपके पूरे कार्यक्रम के लिए घातक होगा।
0

फ़ाइलों को पढ़ने के लिए Scanner का उपयोग (या अन्य प्रकार के इनपुट) मध्य/बड़े पैमाने पर स्थितियों में बेहद अक्षम हो सकता है। यदि आपके पास हजारों या लाखों लाइनों को पढ़ने की प्रदर्शन संबंधी चिंताएं हैं, तो मैं दृढ़ता से अनुशंसा करता हूं कि आप BufferedReader कक्षा का उपयोग करें। System.in से लाइनों को पढ़ने के लिए BufferedReader के उपयोग का एक उदाहरण नीचे प्रदर्शित होता है:

public static void main(String[] args) throws Exception { 

    String line = null; 
    BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); 

    try { 
     /* This is protected code. If an problem occurs here, catch block is triggered */ 
     while ((line = br.readLine()) != null){ 
      System.out.println(line); 
     } 
    } 
    catch (IOException e){ 
     throw new IOException("Problem reading a line",e); 
    } 
} 

IOException try/catch ब्लॉक इसलिए शुरू किया जा सकता में इस्तेमाल किया जाना चाहिए, जब भी इस तरह के एक त्रुटि के रूप में एक "असाधारण" व्यवहार के try ग्रस्त अंदर संरक्षित कोड । जावा की अपनी अपवाद है जो समान स्थिति होने पर डूब जाती है। उदाहरण के लिए, ArrayIndexOutOfBoundsException तब फेंक दिया जाता है जब आप आकार a आकार n परिभाषित करते हैं और आप अपने कोड में a[n+1] स्थिति को एक्सेस करने का प्रयास करते हैं। ArrayIndexOutOfBoundsException के रूप में, कई अन्य अपवाद वर्ग हैं जिन्हें आप अपने संदेशों के साथ फेंक और अनुकूलित कर सकते हैं। अपवाद के लिए उपयुक्त कोड को ब्लॉक ब्लॉक में संरक्षित क्षेत्र में रखा जाना चाहिए। जब उस ब्लॉक में अपवाद होता है, तो अपवाद को इसके साथ कैच ब्लॉक में संभाला जाएगा।

देखो कि आपको त्रुटि स्थिति की उम्मीद करने और प्रत्येक मामले के लिए अपवाद फेंकने के लिए if/else कथन बनाने की आवश्यकता नहीं है। आपको संभावित अपवाद स्थितियों को try और catch ब्लॉक के बीच जोड़ने की आवश्यकता है। सुरक्षित प्रोग्रामिंग के लिए try/catch blocks को और अधिक पढ़ें।

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