जावा एक सार्वभौमिक प्रोग्रामिंग भाषा है जिसमें आपके विशिष्ट कार्यों के लिए कई वैकल्पिक समाधान हैं। फिर भी, अच्छे दृष्टिकोण हैं जिनका पालन किया जाना चाहिए, और कुछ असफल दृष्टिकोण भी हैं जिनका उपयोग हम अभी भी अधिकांश भाग के लिए करते हैं।
निष्पादन के प्रवाह को नियंत्रित करने के लिए अपवादों का उपयोग करने के लिए सबसे आम विफल तरीकों में से एक है। यह दो कारणों से बचा जाना चाहिए:
- यह आपके कोड के प्रदर्शन और गति को कम करता है।
- यह आपके कोड को कम पठनीय बनाता है।
एक उदाहरण देखकर शुरू करते हैं। यहां निष्पादन के प्रवाह को नियंत्रित करने के लिए अपवाद का उपयोग किया जाता है:
public static int findAge(String name) { try { String ageAsString = findUser(name); return ageAsString.length(); } catch (NameNotFoundException e) { return 0; } } private static String findUser(String name) { if(name==null) { throw new NameNotFoundException(); } return name; }
यदि उपयोगकर्ता नाम के लिए एक गैर-शून्य मान प्रदान करता है, तो खोज विधि इस नाम की लंबाई वापस कर देगी, लेकिन यदि उपयोगकर्ता नाम शून्य है, तो खोजकर्ता विधि NameNotFoundException अपवाद को फेंक देगी और इस स्थिति में findAge विधि 0 वापस आ जाएगी।
हम अपवादों का उपयोग किए बिना इस कोड को कैसे बदल सकते हैं? सामान्य तौर पर, कई विकल्प हैं, उनमें से एक पर विचार करें:
public static int findAgeNoEx(String name) { String ageAsString = findUserNoEx(name); return ageAsString.length(); } private static String findUserNoEx(String name) { if(name==null) { return ""; } return name; }
प्रदर्शन पर अपवाद के प्रभाव का पता लगाने के लिए, मैंने निम्नलिखित कोड तैयार किया जो दोनों तरीकों को 10 मिलियन बार कहता है: अपवाद के साथ और बिना।
public class ControlFlowWithExceptionOrNot { public static class NameNotFoundException extends RuntimeException { private static final long serialVersionUID = 3L; } private static final int TRIAL = 10000000; public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); for (int i = 0; i < TRIAL; i++) { findAgeNoEx(null); } System.out.println("Duration :" + (System.currentTimeMillis() - start)); long start2 = System.currentTimeMillis(); for (int i = 0; i < TRIAL; i++) { findAge(null); } System.out.println("Duration :" + (System.currentTimeMillis() - start2)); }; public static int findAge(String name) { try { String ageAsString = findUser(name); return ageAsString.length(); } catch (NameNotFoundException e) { return 0; } } private static String findUser(String name) { if (name == null) { throw new NameNotFoundException(); } return name; } public static int findAgeNoEx(String name) { String ageAsString = findUserNoEx(name); return ageAsString.length(); } private static String findUserNoEx(String name) { if (name == null) { return ""; } return name; } }
निष्कर्ष:
Duration :16 Duration :6212
जैसा कि आप देख सकते हैं, अपवाद का उपयोग करके हमारे इंटेल कोर i7-3630QM पर हजारों मिलीसेकंड खर्च हुए।
यदि हम पठनीयता के संदर्भ में अपने दो खोज तरीकों की तुलना करते हैं, तो अपवाद के बिना विधि बिल्कुल स्पष्ट है: सबसे पहले, हम पूरी तरह से सुनिश्चित हो सकते हैं कि खोजक विधि एक स्ट्रिंग लौटाती है; और दूसरी बात, चाहे जो भी स्ट्रिंग वापस आए, हमें उसकी लंबाई मिल जाएगी। इसी समय, अपवाद वाली विधि कुछ भ्रामक है: यह पूरी तरह से स्पष्ट नहीं है कि क्या खोजक विधि वापस आती है। यह एक स्ट्रिंग लौटा सकता है, या यह एक अपवाद फेंक सकता है और यह विधि हस्ताक्षर से दिखाई नहीं देता है। इस कारण से, कार्यात्मक प्रोग्रामिंग प्रतिमान अपवादों के उपयोग का स्वागत नहीं करता है।
अंत में, यह बेहतर होगा यदि आप अपवादों का उपयोग करते हैं जहां अपवाद वास्तव में उत्पन्न होता है और आवश्यक है। यदि आप निष्पादन के प्रवाह को नियंत्रित करने के लिए अपवादों का उपयोग करते हैं, तो यह कार्यक्रम के प्रदर्शन में गिरावट का कारण बनेगा और आपके कोड को कम पठनीय बनाएगा।
मुझे उम्मीद है कि यह लेख आपके लिए दिलचस्प था, और संभवतः उपयोगी था।