"হাই, অ্যামিগো! চলুন ভুলের বিষয়ে কথা বলা চালিয়ে যাওয়া যাক। এইবার, আমরা এমন ভুলগুলি অন্বেষণ করব যা কম্পাইলার সবসময় আপনাকে সাহায্য করবে না। মনোযোগ দিন এবং আপনি নিজের সম্পর্কে কিছু শিখতে পারবেন।"

"আমি শুনতে প্রস্তুত, দিয়েগো। আমি আশা করি এটি আমার জন্য খুব বিব্রতকর হবে না।"

বস্তুর সাথে তুলনা করা==

"আমাদের সেরা প্রিয় নবাগত প্রোগ্রামার ভুলের তালিকা ==অপারেটর ব্যবহার করে বস্তুর (বিশেষ করে স্ট্রিং) তুলনা করার সাথে শুরু হয়"

উদাহরণ:

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একই সাথে একটি সংগ্রহের উপাদানগুলিকে অতিক্রম করতে এবং সেই সংগ্রহটি সংশোধন করতে একটি লুপ ব্যবহার করতে পারবেন না৷

"এখানে বেশ কয়েকটি সমাধান রয়েছে। প্রথমত, আপনি একটি সংগ্রহ অতিক্রম করতে পারেন এবং অন্যটি পরিবর্তন করতে পারেন:

সমাধান 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;
}

"আপনি জানেন, ডিয়েগো... আপনি এখানে যে ত্রুটিগুলি উপস্থাপন করেছেন তা বিচার করে, মনে হচ্ছে আপনি আমার ব্যক্তিগত জার্নাল পড়ছেন... অথবা আপনি আমাকে কাজগুলি সমাধান করতে দেখছেন।"

"হা! এটা নিয়ে কোনো সন্দেহ নেই। আমি পড়েছি, ট্র্যাক করেছি এবং চালিয়ে যাচ্ছি। তাই সতর্ক থাকুন!"

"???"

"আপনি চিন্তা করবেন না। আমি শুধু মজা করছি। সতর্ক থাকুন এবং কম বোকা ভুল করুন।"