"हाय, अमीगो! आइए गलतियों के बारे में बात करना जारी रखें। इस बार, हम उन गलतियों का पता लगाएंगे जिनमें कंपाइलर हमेशा आपकी मदद नहीं करेगा। ध्यान दें और आप अपने बारे में कुछ सीखेंगे।"

"मैं सुनने के लिए तैयार हूँ, डिएगो। मुझे आशा है कि यह मेरे लिए बहुत शर्मनाक नहीं होगा।"

वस्तुओं से तुलना करना==

"शीर्ष पसंदीदा नौसिखिया प्रोग्रामर गलतियों की हमारी सूची ==ऑपरेटर का उपयोग करके वस्तुओं (विशेष रूप से तार) की तुलना करने से शुरू होती है"

उदाहरण:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("The strings are equal");
}

"मैंने ऐसा बहुत बार किया है। अब मैं स्पष्ट रूप से देख सकता हूं कि यह कोड कभी भी "स्ट्रिंग्स बराबर" प्रदर्शित नहीं करेगा, क्योंकि कथन ifदो अलग-अलग स्ट्रिंग ऑब्जेक्ट्स के संदर्भों की तुलना करता है।

"हाँ। इसलिए सही विकल्प होगा:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
   System.out.println("The strings are equal");
}

Stringकिसी वस्तु का बदलना

"नौसिखिया प्रोग्रामर अक्सर भूल जाते हैं कि कक्षा की सभी वस्तुएं अपरिवर्तनीय हैं , और यह कि Stringकक्षा की प्रत्येक विधि एक नई वस्तु लौटाती है - वर्तमान वस्तु कभी नहीं बदलती।"

"यह बहुत पहले नहीं था कि मैंने सीखा कि अपरिवर्तनीय का क्या अर्थ है, लेकिन मुझे लगता है कि मैंने यह किया है।

"मैं इसके बारे में काफी निश्चित हूं। उदाहरण:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

"यह कोड सही कोड के समान है, लेकिन यह उम्मीद के मुताबिक काम नहीं करेगा। toUpperCase()विधि उस वस्तु को नहीं बदलती जिस पर इसे कहा जाता है। सही कोड इस तरह दिखेगा:

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase

"बिल्कुल सही। मैंने वह किया है, लेकिन मैं वास्तव में यह भी नहीं समझ पाया कि क्या गलत था। स्पष्टीकरण के लिए धन्यवाद!"

उन वस्तुओं को आरंभ करना भूल जाना जो किसी सरणी के तत्व हैं

"एक और आम गलती एक सरणी चर को प्रारंभ करना भूल जाना है। उदाहरण:

int[] array;
array[0] = 1;
array[0] = 2;

"यह कोड काम नहीं करेगा: आपको सरणी चर को कंटेनर ऑब्जेक्ट के संदर्भ के बराबर स्पष्ट रूप से सेट करने की आवश्यकता है जो सरणी के तत्वों को संग्रहीत करेगा। सही संस्करण:

int[] array = new int[10];
array[0] = 1;
array[0] = 2;

उदाहरण चर के बजाय स्थानीय चर का उपयोग करना।

"नए लोगों को वेरिएबल्स के लिए लंबे और सार्थक नामों के साथ आना पसंद नहीं है।"

"यह सच है। चीजों को जल्दी से पूरा करने के लिए, मैं कभी-कभी वेरिएबल नाम देता हूं जैसे a, b, और i।"

"ऐसा मत करो। यह एक क्रूर बात है जब कोड में कई चर होते हैं:

संख्या 99 को एक सरणी के 100 कक्षों में रखें
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

"उचित नामों के साथ कोड में गलतियाँ करना बहुत कठिन है। सही संस्करण इस तरह दिखता है:

संख्या 99 को एक सरणी के 100 कक्षों में रखें
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < 10; i++)
      {
         a[i] = value;
      }
   }
}

एक संग्रह आइटम निकाल रहा है

"क्या आप पहले ही संग्रह देख चुके हैं?"

"सचमुच सिर्फ एक आंख के साथ।"

"यदि आप नहीं जानते कि मैं किस बारे में बात कर रहा हूं, तो भविष्य में देखने के लिए अपने आप को एक नोट बना लें। बहुत बार ऐसी परिस्थितियां होती हैं जब किसी संग्रह से एक निश्चित तत्व को हटाने की आवश्यकता होती है। कोड मोटे तौर पर जैसा दिखता है यह:

ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

for (Integer value: list)
   if (value < 0)
      list.remove(value);

"यह कोड काम नहीं करेगा, क्योंकि आप for-eachसंग्रह के तत्वों को एक साथ पार करने और उस संग्रह को संशोधित करने के लिए लूप का उपयोग नहीं कर सकते हैं।

"कई समाधान हैं। सबसे पहले, आप एक संग्रह को पार कर सकते हैं और दूसरे को बदल सकते हैं:

समाधान 1
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

"दूसरा, जावा 8 के बाद से, संग्रह में एक removeIf()विधि है, जिसके लिए आप एक नियम (लैम्ब्डा फ़ंक्शन) पारित कर सकते हैं जो इंगित करता है कि किन तत्वों को निकालना है। उदाहरण:

समाधान 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );

संशोधक के साथ कई वर्गों को publicएक फ़ाइल में रखना

"एक फ़ाइल में केवल एक सार्वजनिक वर्ग हो सकता है। एक फ़ाइल में अधिक कक्षाएं घोषित की जा सकती हैं, लेकिन उन्हें या तो सार्वजनिक वर्ग की आंतरिक कक्षाएं होनी चाहिए, या संशोधक नहीं होना चाहिए। उदाहरण public:

Solution.java फ़ाइल की सामग्री टिप्पणी
public class Solution
{
}
public class Main
{
}
इसकी अनुमति नहीं है: एक फ़ाइल में दो सार्वजनिक वर्ग।
public class Solution
{
}
class Main
{
}
लेकिन आप ऐसा कर सकते हैं। मुख्य वर्ग सार्वजनिक नहीं है
public class Solution
{
  public static class Main
  {
  }
}
और आप यह कर सकते हैं। मुख्य वर्ग एक नेस्टेड वर्ग है

स्थैतिक main()विधि से किसी वर्ग के साधारण (गैर-स्थैतिक) तरीकों को कॉल करना

"कभी-कभी नौसिखिए प्रोग्रामर विधि या अन्य स्थिर तरीकों से गैर-स्थैतिक चर और विधियों तक पहुँचने का प्रयास करते हैं। main()ऐसा कोड निश्चित रूप से काम नहीं करेगा।

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

   public static void main(String[]args)
   {
      int[] array = createArray();
   }
}

" mainविधि केवल स्थिर विधियों/चरों को संदर्भित कर सकती है। ठीक है, या इसे पहले कक्षा का एक उदाहरण बनाना होगा Solution, और उसके बाद ही उस वस्तु के गैर-स्थैतिक तरीकों को कॉल करें। उदाहरण:

समाधान 1 समाधान 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}

एक कन्स्ट्रक्टर को एक विधि की तरह घोषित करना

"एक और आम गलती गलत तरीके से एक क्लास कंस्ट्रक्टर घोषित करना है। एक कंस्ट्रक्टर का नाम क्लास के नाम के समान होना चाहिए, और एक कंस्ट्रक्टर का कोई परिणाम प्रकार नहीं है। सबसे आम गलतियाँ इस तरह दिखती हैं:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}
यहां रिटर्न टाइप नहीं होना चाहिए
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}
निर्माता का नाम अमान्य है। यह वर्ग के नाम से मेल खाना चाहिए
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this लापता है। वेरिएबल valueखुद को असाइन किया जाएगा
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
वह सब सही है।

इंटरफेस की गलत विरासत

"जावा के रचनाकारों ने इसे अंग्रेजी के बहुत करीब बनाने की कोशिश की, इसलिए उन्होंने कुछ संबंधित अवधारणाओं के लिए अलग-अलग कीवर्ड चुने।

जब एक वर्ग एक वर्ग को इनहेरिट करता है, तो आपको extendsकीवर्ड का उपयोग करना होगा:

class Pet
{
}

class Cat extends Pet
{
}

"जब कोई वर्ग इंटरफ़ेस प्राप्त करता है, या अधिक सटीक रूप से इसे लागू करता है, तो आपको implementsकीवर्ड का उपयोग करने की आवश्यकता होती है:

interface Meow
{
}

class Cat implements Meow
{
}

"जब कोई इंटरफ़ेस इंटरफ़ेस प्राप्त करता है, तो extendsकीवर्ड का उपयोग करें:

interface Meow
{
}

interface Voice extends Meov
{
}

breakएक switchबयान में चूक

"और आज के लिए आखिरी गलती, लेकिन शुरुआती लोगों के लिए आखिरी नहीं, एक बयान breakमें एक बयान शामिल करने में असफल रहा है। उदाहरण:switch

गलत सही
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

"आप जानते हैं, डिएगो... आपके द्वारा यहां प्रस्तुत की गई त्रुटियों के सेट को देखते हुए, ऐसा लगता है कि आप मेरी निजी पत्रिका पढ़ रहे हैं... या आप मुझे कार्यों को हल करते हुए देख रहे हैं।"

"हा! इसमें कोई संदेह नहीं है। मैंने पढ़ा है, ट्रैक किया है और ऐसा करना जारी रखता हूं। इसलिए सतर्क रहें!"

"???"

"चिंता मत करो। मैं तो मज़ाक कर रहा हूँ। सतर्क रहो और बेवकूफी भरी गलतियाँ कम करो।"