क्या उपरोक्त को एक अपवाद माना गया है? कोई तथ्य यह नहीं है कि आप एक अपवाद को संभाल रहे हैं Checked Exceptionअगर यह एक ऐसा नहीं है RuntimeException।
है RuntimeExceptionएक unchecked exception? हाँ
Checked Exceptionsकर रहे हैं subclassesके java.lang.Exception
Unchecked Exceptionsहैं subclassesकीjava.lang.RuntimeException
चेक किए गए अपवादों को फेंकने वाले कॉलों को विधि के कॉलर में एक कोशिश {} ब्लॉक या ऊपर के स्तर में संभाला जाना चाहिए। उस स्थिति में वर्तमान विधि को यह घोषित करना चाहिए कि उसने फेंके गए अपवादों को फेंक दिया ताकि कॉल करने वाले अपवाद को संभालने के लिए उचित व्यवस्था कर सकें।
उम्मीद है की यह मदद करेगा।
प्रश्न: क्या मुझे अपवाद का उपयोग करना चाहिए या अपवाद का उपयोग करना चाहिए?
एक: हाँ यह एक बहुत अच्छा सवाल है और महत्वपूर्ण डिजाइन विचार है। कक्षा अपवाद एक बहुत ही सामान्य अपवाद वर्ग है और इसका उपयोग आंतरिक निम्न स्तर के अपवादों को लपेटने के लिए किया जा सकता है। आप बेहतर एक कस्टम अपवाद बना सकते हैं और उसके अंदर लपेट सकते हैं। लेकिन, और एक बड़ा - अंतर्निहित मूल मूल कारण में कभी अस्पष्ट नहीं। पूर्व के लिए, Don't everनिम्नलिखित करें -
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException("Cannot login!!"); //<-- Eat away original root cause, thus obscuring underlying problem.
}
इसके बजाय निम्नलिखित करें:
try {
attemptLogin(userCredentials);
} catch (SQLException sqle) {
throw new LoginFailureException(sqle); //<-- Wrap original exception to pass on root cause upstairs!.
}
मूल मूल कारण खाने से ठीक होने से परे वास्तविक कारण होता है, उत्पादन समर्थन टीमों के लिए एक बुरा सपना है, जहां उन्हें आवेदन लॉग और त्रुटि संदेश दिए जाते हैं। हालांकि बाद वाला एक बेहतर डिजाइन है, लेकिन कई लोग इसका उपयोग अक्सर नहीं करते हैं क्योंकि डेवलपर्स सिर्फ कॉल करने वाले को अंतर्निहित संदेश देने में विफल होते हैं। तो एक ठोस नोट करें: Always pass on the actual exceptionकिसी भी एप्लिकेशन विशिष्ट अपवाद में लिपटे हुए हैं या नहीं।
कोशिश-पकड़ने पर RuntimeExceptions
RuntimeExceptionसामान्य नियम के रूप में s को पकड़ने की कोशिश नहीं की जानी चाहिए। वे आम तौर पर एक प्रोग्रामिंग त्रुटि का संकेत देते हैं और उन्हें अकेला छोड़ दिया जाना चाहिए। इसके बजाय प्रोग्रामर को कुछ कोड लागू करने से पहले त्रुटि की स्थिति की जांच करनी चाहिए, जिसके परिणामस्वरूप हो सकता है RuntimeException। पूर्व के लिए:
try {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welcome to my site!);
} catch (NullPointerException npe) {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
यह एक खराब प्रोग्रामिंग प्रैक्टिस है। इसके बजाय एक शून्य-जांच की जानी चाहिए थी -
if (userObject != null) {
setStatusMessage("Hello Mr. " + userObject.getName() + ", Welome to my site!);
} else {
sendError("Sorry, your userObject was null. Please contact customer care.");
}
लेकिन ऐसे समय होते हैं जब इस तरह की त्रुटि जाँच महंगी होती है जैसे कि संख्या स्वरूपण, इस पर विचार करें -
try {
String userAge = (String)request.getParameter("age");
userObject.setAge(Integer.parseInt(strUserAge));
} catch (NumberFormatException npe) {
sendError("Sorry, Age is supposed to be an Integer. Please try again.");
}
यहां प्री-इनवोकेशन एरर चेकिंग प्रयास के लायक नहीं है क्योंकि यह अनिवार्य रूप से पार्सइंट () विधि के अंदर सभी स्ट्रिंग-टू-पूर्णांक रूपांतरण कोड को कॉपी करने का मतलब है - और एक डेवलपर द्वारा कार्यान्वित होने पर त्रुटि प्रवण है। इसलिए बेहतर होगा कि आप सिर्फ कोशिश करें।
इसलिए NullPointerExceptionऔर NumberFormatExceptionदोनों RuntimeExceptionsको पकड़ना NullPointerExceptionचाहिए , जब तक NumberFormatExceptionकि त्रुटि प्रवण कोड के संभावित परिचय से बचने के लिए मैं स्पष्ट रूप से पकड़ने की सलाह देता हूं, एक सुंदर अशक्त जांच के साथ बदल देना चाहिए ।
DataSeriesवर्ग है जो डेटा रखता है जो हमेशा समय-आधारित क्रम में रहना चाहिए। एDataPointके अंत में एक नया जोड़ने के लिए एक विधि हैDataSeries। यदि मेरे सारे कोड पूरे प्रोजेक्ट में सही तरीके से काम कर रहे हैं, तोDataPointकभी भी उस अंत में नहीं जोड़ा जाना चाहिए , जिसकी पहले से एक तारीख पहले से है। पूरे प्रोजेक्ट में हर मॉड्यूल इस ट्रूइज्म के साथ बनाया गया है। हालांकि, मैं इस स्थिति की जांच करता हूं और ऐसा होने पर अनियंत्रित अपवाद को फेंक देता हूं। क्यों? यदि ऐसा होता है, तो मैं जानना चाहता हूं कि यह कौन कर रहा है और इसे ठीक कर रहा है।