"हाय, अमिगो! चुकांबद्दल बोलूया. यावेळी, आम्ही अशा चुका शोधू ज्यात कंपाइलर तुम्हाला नेहमीच मदत करणार नाही. लक्ष द्या आणि तुम्हाला तुमच्याबद्दल काहीतरी शिकायला मिळेल."

"डिएगो, मी ऐकायला तयार आहे. मला आशा आहे की हे माझ्यासाठी खूप लाजिरवाणे होणार नाही."

यांच्याशी वस्तूंची तुलना करणे==

"आमच्या आवडत्या नवशिक्या प्रोग्रामरच्या चुकांची यादी ==ऑपरेटर वापरून ऑब्जेक्ट्सची (विशेषतः स्ट्रिंग्स) तुलना करण्यापासून सुरू होते"

उदाहरण:

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."

"ते करू नका. जेव्हा कोडमध्ये असे अनेक व्हेरिएबल्स असतात तेव्हा करणे ही एक क्रूर गोष्ट आहे:

अॅरेच्या 100 सेलमध्ये 99 क्रमांक ठेवा
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;
    }
  }
}

"योग्य नावांसह कोडमध्ये चुका करणे अधिक कठीण आहे. योग्य आवृत्ती अशी दिसते:

अॅरेच्या 100 सेलमध्ये 99 क्रमांक ठेवा
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एकाच वेळी संग्रहातील घटकांवर जाण्यासाठी आणि त्या संग्रहात सुधारणा करण्यासाठी लूप वापरू शकत नाही.

"अनेक उपाय आहेत. प्रथम, तुम्ही एक संग्रह पार करून दुसरा बदलू शकता:

उपाय १
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);

"दुसरे, Java 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, आणि त्यानंतरच त्या ऑब्जेक्टच्या नॉन-स्टॅटिक पद्धतींना कॉल करा. उदाहरण:

उपाय १ उपाय 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;
}

"तुम्हाला माहिती आहे, डिएगो... तुम्ही येथे सादर केलेल्या त्रुटींच्या संचानुसार, असे वाटते की तुम्ही माझे वैयक्तिक जर्नल वाचत आहात... किंवा तुम्ही मला कार्ये सोडवताना पाहत आहात."

"हा! याबद्दल शंका नाही. मी वाचले आहे, मागोवा घेतला आहे आणि पुढेही करत आहे. तेव्हा सावध रहा!"

"???"

"तुम्ही काळजी करू नका. मी फक्त गंमत करत आहे. सावध राहा आणि कमी मूर्ख चुका करा."