/ / सोनारक्यूब त्रुटि: इस विधि को सबसे अधिक एक अपवाद पर फेंकने के लिए रिफ्लेक्टर - जावा, अपवाद-हैंडलिंग, सोनारक्बी

सोनारक्यूब त्रुटि: इस विधि को सबसे अधिक चेक किए गए अपवाद पर फेंकने के लिए दोहराएं - जावा, अपवाद-हैंडलिंग, सोनारक्वे

मैं सोनारक्यूब का उपयोग कर रहा हूं और यह निम्नलिखित त्रुटि दिखाता है:

Public methods should throw at most one checked exception.

// Noncompliant
public void delete() throws IOException, SQLException { /* ... */ }

// Compliant
public void delete() throws SomeApplicationLevelException { /* ... */ }

क्या इसका मतलब है, SomeApplicationLevelException एक अभिभावक वर्ग है और IOException तथा SQALException इससे व्युत्पन्न हैं? और हमें मूल वर्ग अपवाद को फेंक देना चाहिए? जिससे केवल 1 जाँच अपवाद को फेंकने की विधि का पालन हो रहा है?

क्योंकि मेरे पास 2 अपवाद हैं जिन्हें मैंने उदाहरण के लिए परिभाषित किया है Exception1 तथा Exception2 जो विस्तारित है Exception। और मेरी विधि कहती है, sampleMethod() उन्हें फेंकता है यानी

public void sampleMethod() throws Exception1, Exception2 {
}

और यहां त्रुटि दिखाई गई है। तो क्या मुझे माता-पिता के रूप में एक वर्ग (कहना चाहिए) MainException) और व्युत्पन्न Exception1 तथा Exception2 इसमें से और मूल अपवाद वर्ग को फेंक दें नीचे की तरह:

public void sampleMethod() throws MainException {
}

क्या उपरोक्त समाधान उचित है?

उत्तर:

जवाब के लिए 3 № 1

यदि आपके आवेदन में एक विधि है जिसे घोषित किया गया है throws SQLException, IOException, आप शायद आंतरिक कार्यान्वयन के विवरण को अपनी विधि के उपयोगकर्ताओं को लीक कर रहे हैं। विशेष रूप से, आप कह रहे हैं:

  1. आपका तरीका JDBC और फ़ाइल I / O का उपयोग करके लागू किया गया है। आपके उपयोगकर्ता इस बात का ध्यान नहीं रखते हैं कि आपकी विधि कैसे लागू की जाती है, वे केवल इस बात की परवाह करते हैं कि आपकी विधि क्या करती है

  2. आपका तरीका, भविष्य के किसी भी संस्करण को शामिल करना, कभी भी किसी अन्य चेक किए गए अपवाद को नहीं फेंकेंगे। यदि भविष्य में आप अपना तरीका बदलते हैं, ताकि यह एक और जाँच अपवाद को फेंक सके, तो यह पीछे की संगतता को तोड़ देगा।

सलाह यह है कि अपना खुद का बनाएंअनुप्रयोग-विशिष्ट वर्ग (अपवाद से व्युत्पन्न), और केवल उसी को अपनी पद्धति में फेंकें। यदि आप चाहें तो अपने आवेदन-विशिष्ट अपवाद के अंदर SQLException या IOException (या कोई अन्य अपवाद) को लपेटें जैसे कारण.

हालाँकि, ध्यान दें, कि विचार का एक विद्यालय है जो कहता है जावा जाँच अपवाद एक बुरा विचार है (और कारणों में से एक सी #, और अधिक आधुनिक भाषाएँ जैसे कोटलिन, डॉन "टी ने अपवादों की जाँच की है)।"


जवाब के लिए 0 № 2

IOexception और sqlexception दोनों की जाँच की जाती हैअपवाद एस, एक दूसरे से पूरी तरह से अलग, अब अगर हम दोनों एक अपवाद से विस्तार करते हैं और माता-पिता अपवाद को फेंक देते हैं, जो जावा में अनिवार्य नहीं है, तो यह एपीआई के उपयोगकर्ता को गुमराह करने वाला होगा।

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

उदाहरण के लिए

try{

///piece of code that throws IOException and SQLException
}catch(IOException | SQLException ex){
throw new DataException(ex,"Any customized message you want");
}

इस DataException तो विधि हस्ताक्षर के फेंकता खंड में शामिल किया जाएगा इस कोशिश को पकड़ने।

DataException Exception क्लास का विस्तार करता है और पूर्ववर्ती में आप अपने मूल अपवाद को संरक्षित करने के साथ कस्टम अपवाद में मूल अपवाद को लपेटकर आपके द्वारा अपवादित किए जा रहे हैं।