2015-12-28 7 views
5

मैं नामक एक विधि main विधि में readFile() नाम है, readFile() FileNotFoundException फेंकता है लेकिन main निम्नलिखित की तरह, नहीं करता है:जब FileNotFoundException फेंक

public static void main(String[] args){ 
    readFile(); 
} 

public static void readFile() throws FileNotFoundException{ 
    Scanner input = new Scanner(new File("file.txt")); 
    ... 
} 

जब मैं कार्यक्रम संकलित, मैं readFile() में एक त्रुटि मिली main विधि में। ऐसा लगता है कि मुझे main के शीर्षलेख में अपवाद फेंकने की आवश्यकता है। मुझे main और readFile() दोनों शीर्षकों में अपवाद फेंकने की आवश्यकता क्यों है?

+6

आप इसे पकड़ने के लिए की जरूरत है, यह नहीं फेंक देते हैं। –

+2

आप इस अपवाद का प्रचार करके क्या हासिल करना चाहते हैं? –

+1

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

उत्तर

3

Exceptions को संभालने के लिए आपके विकल्प उन्हें पकड़ने और तुरंत उनके साथ सौदा करने या उन्हें फ़ंक्शन में फेंकने और फ़ंक्शन के कॉलर तक अपवाद को प्रसारित करने के लिए हैं।

main के लिए, यह catch पर समझ में आता है और वहां अपवाद को संभालता है।

public static void main(String[] args){ 
    try { 
    readFile(); 
    } catch (FileNotFoundException e) { 
    // Do something with `e` 
    } 
} 

public static void readFile() throws FileNotFoundException { 
    Scanner input = new Scanner(new File("file.txt")); 
    // ... 
} 

हालांकि, अगर आप भी कुछ इस तरह कर सकता है:

public static void main(String[] args){ 
    readFile(); 
} 

public static void readFile() { 
    try { 
    Scanner input = new Scanner(new File("file.txt")); 
    // ... 
    } catch (FileNotFoundException e) { 
    // Do something with `e` or handle it accordingly. 
    } 
} 

मैं main में अपवाद फेंकने के खिलाफ सलाह देंगे, लेकिन उसके बाद यह वास्तव में आप एक "वापस ऊपर" है या नहीं की बात है अगर कुछ विफल रहता है। अधिक जानकारी के लिए, this question शानदार विवरण है।

1

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

+3

क्या होगा यदि कुछ अन्य जावा क्लास 'मुख्य' कहें तो? – MadProgrammer

+0

@MadProgrammer - तो यह खराब प्रोग्रामिंग है और नहीं किया जाना चाहिए (IMHO)। मुख्य एक प्रवेश बिंदु है, जिसे आंतरिक रूप से –

+1

नहीं कहा जाना चाहिए, कोई भी कम नहीं होता है, ऐसा इसलिए होता है क्योंकि हम सोचते हैं कि यह बुरा है, इसे होने से नहीं रोकता है, और वास्तव में डिजाइन द्वारा किया जा सकता है। आप अपवाद को 'मुख्य' से फेंक सकते हैं और जेवीएम इसे संभाल लेगा (बस अपरिचित अपवादों की तरह), लेकिन इसके लिए अधिक जानकारी की आवश्यकता होगी;) - मेरी निजी वरीयता 'मुख्य' विधि में इसका सामना करना है, लेकिन, यह हमेशा संभव नहीं है – MadProgrammer

1

आप अपवाद एक वादा के रूप में throws कीवर्ड की

public static void main(String[] args){ 
    readFile(); 
} 

public static void readFile() { 
    try { 
     Scanner input = new Scanner(new File("file.txt")); 
     ... 
    } catch (FileNotFoundException ex) { 
     // Error message 
    } catch (Exception ex) { 
     // Incase a different exception is caught 
    } 
} 
5

Think को पकड़ने के लिए की जरूरत है; आप कह रहे हैं कि अब आप अपवाद को पकड़ने वाले नहीं हैं, लेकिन आप इसे कॉलिंग स्टेटमेंट पर पकड़ने जा रहे हैं।

आपके वर्तमान में readFile विधि में मौजूद कोड पूरी तरह से मान्य लगता है, लेकिन आपको अपवाद को उचित रूप से संभालने के लिए try-catch में कॉलिंग कथन को लपेटने की आवश्यकता है।

7

जावा के अपवादों के बारे में कुछ विवाद है। इसमें दो वर्ग अपवाद हैं। चेक किया गया और अनचेक किया गया। RuntimeException या त्रुटि से विस्तारित कोई भी अपवाद अनचेक किया गया है और किसी विधि हस्ताक्षर में फेंकने योग्य या स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है।

फ़ाइल नॉटफाउंड हालांकि एक चेक अपवाद है और इसे विधि हस्ताक्षर में फेंकने के रूप में पकड़ा या घोषित किया जाना चाहिए।

मूल विचार यह है कि चेक अपवाद ऐसे हैं जिन्हें आप पुनर्प्राप्त करने में सक्षम हो सकते हैं, जबकि अनचेक अपवाद प्रोग्रामिंग में सबसे अधिक संभावना अप्राप्य त्रुटि से आ रहे हैं।

आप यहाँ इसके बारे में सब पढ़ सकते हैं: https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

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