1. Membandingkan objek dengan==

Kesilapan kegemaran pengaturcara baru ialah membandingkan objek (terutama rentetan) menggunakan ==operator. Sebagai contoh:

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

Kod ini tidak akan sekali-kali memaparkan "Rentetan adalah sama", kerana ifpernyataan itu membandingkan rujukan kepada dua objek rentetan yang berbeza.

Berikut ialah versi kod yang betul:

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");
}


2. Menukar Stringobjek

Pengaturcara baru sering terlupa bahawa semua objek kelas tidak boleh diubah , dan setiap kaedah kelas Stringmengembalikan objek baharu — objek semasa tidak pernah berubah.

Contoh:

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

Kod ini sangat serupa dengan kod yang betul, tetapi ia tidak akan berfungsi seperti yang diharapkan. Kaedah ini toUpperCase()tidak mengubah objek yang dipanggil. Kod yang betul akan kelihatan seperti ini:

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


3. Terlupa untuk memulakan objek yang merupakan elemen tatasusunan

Satu lagi kesilapan biasa ialah lupa untuk memulakan pembolehubah tatasusunan. Contoh:

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

Kod ini tidak akan berfungsi: anda perlu menetapkan pembolehubah tatasusunan secara eksplisit sama dengan rujukan kepada objek bekas yang akan menyimpan elemen tatasusunan.

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


4. Menggunakan pembolehubah tempatan dan bukannya pembolehubah contoh.

Pemula tidak suka menghasilkan nama yang panjang dan bermakna untuk pembolehubah. Mereka kerap menggunakan nama satu huruf: a, b, i, dsb. Itu adalah satu perkara yang kejam untuk dilakukan apabila kod tersebut mempunyai beberapa pembolehubah seperti itu:

Letakkan nombor 99 ke dalam 100 sel tatasusunan
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;
    }
  }
}

Kod di atas tidak akan disusun. Versi yang betul kelihatan seperti ini:

Letakkan nombor 99 ke dalam 100 sel tatasusunan
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 < count; i++)
      {
         a[i] = value;
      }
   }
}


5. Mengalih keluar item koleksi

Selalunya terdapat situasi apabila elemen tertentu perlu dialih keluar daripada koleksi. Kod kelihatan lebih kurang seperti ini:

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);

Kod ini tidak akan berfungsi, kerana anda tidak boleh menggunakan gelung untuk setiap gelung untuk melintasi elemen koleksi dan mengubah suai koleksi itu secara serentak.

Terdapat beberapa penyelesaian. Pertama, anda boleh pergi melintasi satu koleksi dan menukar yang lain:

Penyelesaian 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);

Kedua, sejak Java 8, koleksi mempunyai removeIf()kaedah, yang mana anda boleh lulus peraturan (fungsi lambda) yang menunjukkan elemen mana yang hendak dialih keluar.

Contoh:

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

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


6. Meletakkan beberapa kelas dengan publicpengubah suai ke dalam satu fail

Hanya boleh ada satu kelas awam dalam fail. Lebih banyak kelas boleh diisytiharkan dalam fail, tetapi mereka mesti sama ada kelas dalaman kelas awam, atau tidak mempunyai pengubah publicsuai. Contoh:

Kandungan fail Solution.java Catatan
public class Solution
{
}
public class Main
{
}
Ini tidak dibenarkan: dua kelas awam dalam satu fail.
public class Solution
{
}
class Main
{
}
Tetapi anda boleh melakukan ini. Kelas Utama bukan awam
public class Solution
{
  public static class Main
  {
  }
}
Dan anda boleh melakukan ini. Kelas Utama ialah kelas bersarang


7. Memanggil kaedah biasa (bukan statik) kelas daripada main()kaedah statik

Kadangkala pengaturcara baru cuba mengakses pembolehubah dan kaedah bukan statik daripada main()kaedah atau kaedah statik lain. Kod sedemikian tidak akan berfungsi, sudah tentu.

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

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

Kaedah utama hanya boleh merujuk kepada kaedah/pembolehubah statik. Nah, atau ia mesti membuat contoh kelas Solution, dan kemudian memanggil kaedah bukan statik objek itu. Contoh:

Penyelesaian 1 Penyelesaian 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();
  }
}


8. Mengisytiharkan pembina seperti kaedah

Satu lagi kesilapan biasa ialah mengisytiharkan pembina kelas secara salah. Nama pembina mestilah sama dengan nama kelas, dan pembina tidak mempunyai jenis hasil. Kesilapan yang paling biasa kelihatan seperti ini:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Tidak sepatutnya ada jenis pemulangan di sini
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Nama pembina tidak sah. Nama pembina mesti sepadan dengan nama kelas
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






this sedang hilang. Pembolehubah valueakan diberikan kepada dirinya sendiri
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




Itu semua betul


9. Warisan antara muka yang salah

Pencipta Java cuba menjadikannya sangat hampir dengan bahasa Inggeris, jadi mereka memilih kata kunci yang berbeza untuk konsep berkaitan tertentu.

Apabila kelas mewarisi kelas, anda perlu menggunakan extendskata kunci:

class Pet
{
}

class Cat extends Pet
{
}

Apabila kelas mewarisi antara muka, anda perlu menggunakan implementskata kunci:

interface Meow
{
}

class Cat implements Meow
{
}

Apabila antara muka mewarisi antara muka, gunakan extendskata kunci:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Meninggalkan breakdalam switchkenyataan

Dan kesilapan terakhir untuk kita hari ini, tetapi bukan yang terakhir untuk pemula, adalah gagal memasukkan kenyataan breakdalam switchkenyataan. Contoh

salah Betul
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;
}