शुरुआती Java डेवलपर्स की शीर्ष गलतियाँ: A से Z तक
Java एक शक्तिशाली, लेकिन सख्त भाषा है। शुरुआती अक्सर उन्हीं सामान्य गलतियों में फंस जाते हैं, जिन्हें अनुभवी डेवलपर्स स्वचालित रूप से टाल देते हैं। इस लेख में हम उन 10 सबसे आम गलतियों पर चर्चा करेंगे जो शुरुआती Java प्रोग्रामर करते हैं। आप न केवल यह जानेंगे कि वे क्यों होती हैं, बल्कि यह भी कि सही पैटर्न और best practices का उपयोग करके उन्हें कैसे ठीक किया जाए।
1. भूला हुआ NullPointerException (NPE)
Java में सबसे आम गलती। यह तब होती है जब आप किसी ऐसे ऑब्जेक्ट की विधि को कॉल करने या उसके फ़ील्ड तक पहुँचने का प्रयास करते हैं जो null है।
समस्या
public class User { private String name; public int getNameLength() { return name.length(); // NPE, यदि name == null }}समाधान
उपयोग से पहले हमेशा ऑब्जेक्ट्स को null के लिए जाँचें। Optional या @Nullable / @NonNull एनोटेशन का उपयोग करें।
public int getNameLength() { return Optional.ofNullable(name) .map(String::length) .orElse(0);}2. equals() और hashCode() के अनुबंध की अनदेखी
यदि आप equals() को ओवरराइड करते हैं, तो आपको अनिवार्य रूप से hashCode() को भी ओवरराइड करना होगा। अन्यथा, आपके ऑब्जेक्ट HashSet, HashMap और अन्य कलेक्शन में सही ढंग से काम नहीं करेंगे।
समस्या
public class Person { private String id; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(id, person.id); } // hashCode() ओवरराइड नहीं किया गया!}
// HashMap में दो "समान" ऑब्जेक्ट अलग-अलग बकेट में होंगेMap<Person, String> map = new HashMap<>();map.put(new Person("1"), "Alice");System.out.println(map.get(new Person("1"))); // nullसमाधान
हैश-कोड उत्पन्न करने के लिए हमेशा Objects.hash() का उपयोग करें:
@Overridepublic int hashCode() { return Objects.hash(id);}3. Generics का गलत उपयोग (रॉ टाइप्स)
रॉ टाइप्स (raw types) का उपयोग आपको कंपाइल टाइम पर टाइप चेकिंग से वंचित करता है। इससे रनटाइम पर ClassCastException होता है।
समस्या
List list = new ArrayList(); // रॉ टाइपlist.add("स्ट्रिंग");list.add(123); // कंपाइलर शिकायत नहीं करता
String s = (String) list.get(1); // ClassCastException!समाधान
List<String> list = new ArrayList<>();list.add("स्ट्रिंग");// list.add(123); // कंपाइलेशन एरर — बढ़िया!String s = list.get(0); // सुरक्षित4. कलेक्शन में ऑब्जेक्ट्स का म्यूटेशन
किसी ऑब्जेक्ट के फ़ील्ड को बदलना जो पहले से HashSet में है या HashMap में कुंजी है, डेटा संरचना को तोड़ देता है। ऑब्जेक्ट का हैश-कोड बदल जाता है, लेकिन बकेट वही रहती है।
समस्या
Set<StringBuilder> set = new HashSet<>();StringBuilder sb = new StringBuilder("A");set.add(sb);sb.append("B"); // म्यूटेशनSystem.out.println(set.contains(sb)); // false हो सकता है!समाधान
कुंजियों के रूप में इम्यूटेबल ऑब्जेक्ट्स (String, Integer, record) का उपयोग करें। यदि ऑब्जेक्ट को बदलने की आवश्यकता है — तो इसे कलेक्शन से हटाएँ, बदलें, और फिर वापस जोड़ें।
5. अपवादों का गलत प्रबंधन
दो चरम सीमाएँ: या तो अपवादों को निगलना (खाली catch), या बहुत सामान्य अपवाद फेंकना (throws Exception)।
समस्या
try { // खतरनाक कोड} catch (Exception e) { // कुछ नहीं करते — त्रुटि खो गई}
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
JavaScript परियोजनाओं के लिए CI/CD: GitHub Actions A से Z तक
PHP हैकाथॉन: कैसे जीतें, जूरी को प्रभावित करें और पागल न हों
2025 में वेब डेवलपमेंट के लिए 10 सर्वश्रेष्ठ C++ फ्रेमवर्क
Kotlin में एल्गोरिदम और डेटा संरचनाएँ: एक व्यावहारिक मार्गदर्शिका
C# में मॉक-ऑब्जेक्ट और फिक्स्चर: आदर्श यूनिट टेस्ट का रहस्य