"Hai, Amigo! Mari kita teruskan bercakap tentang kesilapan. Kali ini, kami akan meneroka kesilapan yang pengkompil tidak akan selalu membantu anda. Beri perhatian dan anda akan belajar sesuatu tentang diri anda."

"Saya sedia mendengar, Diego. Saya harap perkara ini tidak memalukan saya."

Membandingkan objek dengan==

"Senarai kesilapan pengaturcara pemula kegemaran kami bermula dengan membandingkan objek (terutama rentetan) menggunakan ==operator"

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

"Saya telah melakukannya dengan kerap. Sekarang saya dapat melihat dengan jelas bahawa kod ini tidak akan memaparkan "Rentetan adalah sama", kerana ifpernyataan itu membandingkan rujukan kepada dua objek rentetan yang berbeza."

"Ya. Itulah sebabnya pilihan yang betul ialah:

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

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

"Tidak lama dahulu saya belajar apa yang tidak berubah , tetapi saya fikir saya telah melakukan ini.

"Saya agak pasti mengenainya. 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. toUpperCase()Kaedah ini tidak mengubah objek yang dipanggil. Kod yang betul akan kelihatan seperti ini:

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

"Tepat sekali. Saya telah melakukan itu, tetapi saya tidak benar-benar memahami apa yang salah. Terima kasih atas penjelasan!"

Terlupa untuk memulakan objek yang merupakan unsur 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. Versi yang betul:

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

Menggunakan pembolehubah tempatan dan bukannya pembolehubah contoh.

"Pemula tidak suka menghasilkan nama yang panjang dan bermakna untuk pembolehubah."

"Itu benar sekali. Untuk menyelesaikan sesuatu dengan cepat, saya kadangkala memberikan nama pembolehubah seperti a, b, dan i."

"Jangan lakukan itu. Itu adalah perkara yang kejam untuk dilakukan apabila kod itu 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;
    }
  }
}

"Adalah lebih sukar untuk membuat kesilapan dalam kod dengan nama yang betul. 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 < 10; i++)
      {
         a[i] = value;
      }
   }
}

Mengalih keluar item koleksi

"Adakah anda sudah melihat koleksi?"

"Secara harfiah hanya dengan satu mata."

"Jika anda tidak tahu apa yang saya maksudkan, maka buat nota kepada diri sendiri untuk melihat pada masa hadapan. Selalunya terdapat situasi apabila elemen tertentu perlu dialih keluar daripada koleksi. Kod itu 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 for-eachgelung 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 anda boleh luluskan peraturan (fungsi lambda) yang menunjukkan elemen 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 );

Meletakkan beberapa kelas dengan publicpengubah suai ke dalam satu fail

"Hanya terdapat 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 suai. Contoh public:

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

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

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

" mainKaedah ini hanya boleh merujuk kepada kaedah/pembolehubah statik. Nah, atau ia mesti mencipta contoh kelas dahulu 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();
  }
}

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

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, atau, lebih tepat lagi, melaksanakannya, anda perlu menggunakan kata implementskunci:

interface Meow
{
}

class Cat implements Meow
{
}

"Apabila antara muka mewarisi antara muka, gunakan extendskata kunci:

interface Meow
{
}

interface Voice extends Meov
{
}

Meninggalkan breakdalam switchkenyataan

"Dan kesilapan terakhir untuk 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;
}

"Anda tahu, Diego... Berdasarkan set kesilapan yang anda sampaikan di sini, rasanya anda telah membaca jurnal peribadi saya... Atau anda telah memerhatikan saya menyelesaikan tugasan."

"Ha! Jangan ragu mengenainya. Saya telah membaca, menjejaki, dan terus berbuat demikian. Jadi berjaga-jaga!"

"???"

"Jangan risau. Saya gurau saja. Berwaspada dan kurangkan kesilapan bodoh."