2010-07-04 27 views
5

मुझे 3 अपवादों को संभालने के दौरान निम्न विधियों को लागू करने में थोड़ी सी परेशानी हो रही है, जिनकी मुझे देखभाल करना है। क्या मुझे कोशिश/पकड़ने वाले ब्लॉक शामिल करना चाहिए जैसे कि मैं कर रहा हूं या क्लास डिज़ाइन के बजाय एप्लिकेशन के लिए छोड़ा जाना चाहिए?जावा अपवाद हैंडलिंग विधि

विधि कहते हैं मैं इस को लागू करने वाला हूँ:

public Catalog loadCatalog(String filename) 
     throws FileNotFoundException, IOException, DataFormatException 

इस विधि संग्रह उत्पादों की एक सूची में निर्दिष्ट से जानकारी लोड करता है और सूची देता है।

यह पढ़ने के लिए फ़ाइल खोलकर शुरू होता है। फिर यह फ़ाइल की प्रत्येक पंक्ति को पढ़ने और संसाधित करने के लिए आगे बढ़ता है।

  • लाइन के प्रकार के "उत्पाद" है, तो विधि readProduct कहा जाता है:

    विधि String.startsWith लाइन के प्रकार का निर्धारण करने के लिए प्रयोग किया जाता है।

  • यदि लाइन का प्रकार "कॉफी" है, तो विधि पढ़ने को विधि कहा जाता है।
  • यदि लाइन का प्रकार "ब्रेवर" है, तो विधि पढ़ने को पकड़ा जाता है। कॉफीब्रेवर कहा जाता है।

के बाद लाइन संसाधित किया जाता है, loadCatalog उत्पादों की सूची के लिए उत्पाद (उत्पाद, कॉफी या शराब बनानेवाला) कहते हैं।

जब फ़ाइल की सभी पंक्तियों को संसाधित किया गया है, loadCatalog कॉल को बनाने वाली विधि में उत्पादों का कैटलॉग लौटाता है।

इस विधि निम्न अपवादों फेंक कर सकते हैं:

  • FileNotFoundException - यदि फ़ाइलें मौजूद नहीं है।
  • IOException - यदि निर्दिष्ट फ़ाइल की जानकारी पढ़ने में कोई त्रुटि है।
  • DataFormatException - अगर एक लाइन में त्रुटियाँ हैं (अपवाद लाइन गलत डेटा की गई है,)

यहाँ मैं अब तक है:

public Catalog loadCatalog(String filename) 
     throws FileNotFoundException, IOException, DataFormatException{ 
    String line = ""; 
    try { 
     BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat")); 
      try { 
       BufferedReader input = new BufferedReader(
        new FileReader(stdIn.readLine())); 
       while(! stdIn.ready()){ 
        line = input.readLine();       
        if(line.startsWith("Product")){ 
         try { 
          readProduct(line); 
         } catch(DataFormatException d){ 
          d.getMessage(); 
         } 
        } else if(line.startsWith("Coffee")){ 
         try { 
          readCoffee(line);        
         } catch(DataFormatException d){ 
          d.getMessage(); 
         } 
        } else if(line.startsWith("Brewer")){ 
         try { 
          readCoffeeBrewer(line); 
         } catch(DataFormatException d){ 
          d.getMessage(); 
         } 
        } 
       } 
      } catch (IOException io){ 
       io.getMessage(); 
      } 
    }catch (FileNotFoundException f) { 
     System.out.println(f.getMessage()); 
    } 
    return null; 
} 

उत्तर

1

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

public Catalog loadCatalog(String filename) 
    throws FileNotFoundException, 
      IOException, 
      DataFormatException 
{ 
    String line = ""; 

    BufferedReader stdIn = new BufferedReader(new FileReader("catalog.dat")); 
    BufferedReader input = new BufferedReader(new FileReader(stdIn.readLine())); 

    while(!stdIn.ready()) 
    { 
     line = input.readLine(); 

     if(line.startsWith("Product")) 
     { 
      readProduct(line); 
     } 
     else if(line.startsWith("Coffee")) 
     { 
      readCoffee(line); 
     } 
     else if(line.startsWith("Brewer")) 
     { 
      readCoffeeBrewer(line); 
     } 
    } 

    return null; 
} 

और फिर विधि (संभवतः मुख्य) कि loadCatalog कॉल में आप के लिए होता है:

try 
{ 
    loadCatalog(...); 
} 
catch(FileNotFoundException ex) 
{ 
    ex.printStackTrace(); 
} 
catch(IOException ex) 
{ 
    ex.printStackTrace(); 
} 
catch(DataFormatException ex) 
{ 
    ex.printStackTrace(); 
} 

कुछ के साथ printStackTrace जगह

है कि आप की तरह अपने कोड कुछ बदल जाएगा ऐसा करने के लिए उचित।

इस तरह विधि, loadCatalog, त्रुटि संदेशों को प्रदर्शित करने के साथ सौदा नहीं करता है, इसलिए आप विधि को GUI या कंसोल कोड में कॉल कर सकते हैं और कोड जो कॉल करता है यह चुन सकता है कि उपयोगकर्ता को त्रुटि कैसे प्रदर्शित करें (या किसी भी तरह से इसके साथ सौदा)।

4

यह है कि क्या आप चाहते हैं पर निर्भर करता है अपवाद को संभालने के लिए इसका उपयोग करने वाले एप्लिकेशन का वर्ग या दूसरा भाग और जो कुछ भी आवश्यक है उसे करें।

के बाद से कोड का उपयोग करेगा loadCatalog()शायद क्या एक फ़ाइल मैं/हे या प्रारूप अपवाद के साथ क्या करना पता नहीं होगा, व्यक्तिगत रूप से, मैं CatalogLoadException की तरह एक अपवाद बनाने के साथ जाने के लिए और भीतर से फेंक था loadCatalog() विधि, और कारण अपवाद (FileNotFoundException, IOException, DataFormatException) इसके अंदर एक सूचनात्मक संदेश सहित, जिसमें अपवाद ट्रिगर किया गया था, के आधार पर डालें।

try { 
     ... 
    //do this for exceptions you are interested in. 
    } catch(Exception e) { 
     //maybe do some clean-up here. 
     throw new CatalogLoadException(e); // e is the cause. 
    } 

इस तरह अपने loadCatalog() विधि केवल फेंक होगा एक एकल और सार्थक अपवाद।

अब कोड जो loadCatalog() का उपयोग करेगा, केवल एक अपवाद से निपटना होगा: CatalogLoadException

loadCatalog(String filename) throws CatalogLoadException 

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

यह प्रश्न Exception Translation पर भी देखें। फेंकने हस्ताक्षर की आवश्यकता पर


अद्यतन:

आप कि हस्ताक्षर तो रखने के लिए है, तो आप वास्तव में एक विकल्प नहीं है, लेकिन throw करने के लिए उन्हें आवेदन करने के लिए और नहीं उन्हें अंदर catchloadCatalog() विधि, अन्यथा throws हस्ताक्षर बेकार होगा, क्योंकि हम सटीक उसी अपवाद को फेंकने वाले नहीं हैं जिसे हमने अभी निपटाया है।

+0

धन्यवाद, यह केवल 1 अपवाद है कि उन सभी को संभालती फेंकने के लिए एक बेहतर डिजाइन तकनीक की तरह ध्वनि करता है। मैं इसे अब से एक शॉट देता हूं। हालांकि, मैं यह उल्लेख करना भूल गया था कि इस विशेष अभ्यास (स्कूल के लिए) के लिए मुझे विधि को ठीक तरह से लागू करना है क्योंकि बाद में मुझे इसे एक प्रीपेड टेस्फाइल ऐप के माध्यम से चलाने और इसे सुनिश्चित करने के लिए सुनिश्चित करना है। – edu222

0

यहां अपवाद हैंडलिंग से निपटने, हेनज़ कबाबज़ का एक उत्कृष्ट लेख है। सलाह के महान टुकड़े के लिए

http://www.javaspecialists.eu/archive/Issue162.html

+0

इसे पारित करने के लिए धन्यवाद, जैसे ही मुझे मौका मिलता है मैं इसे पढ़ता हूं :) – edu222

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