"Hai, Amigo! Mari kita lanjutkan berbicara tentang kesalahan. Kali ini, kita akan mengeksplorasi kesalahan yang tidak selalu dapat dibantu oleh kompiler. Perhatikan dan Anda akan mempelajari sesuatu tentang diri Anda."

"Aku siap mendengarkan, Diego. Kuharap ini tidak terlalu memalukan bagiku."

Membandingkan benda dengan==

"Daftar kesalahan programmer pemula favorit kami dimulai dengan membandingkan objek (terutama string) 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 sudah cukup sering melakukannya. Sekarang saya dapat dengan jelas melihat bahwa kode ini tidak akan pernah menampilkan" Stringnya sama ", karena pernyataan tersebut ifmembandingkan referensi ke dua objek string yang berbeda."

"Ya. Itu sebabnya pilihan yang tepat adalah:

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

Mengubah Stringobjek

"Pemrogram pemula sering lupa bahwa semua objek kelas tidak dapat diubah , dan bahwa setiap metode kelas Stringmengembalikan objek baru — objek saat ini tidak pernah berubah."

"Belum lama ini saya belajar apa arti abadi , tapi saya pikir saya sudah melakukan ini.

"Saya cukup yakin akan hal itu. Contoh:

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

"Kode ini sangat mirip dengan kode yang benar, tetapi tidak akan berfungsi seperti yang diharapkan. toUpperCase()Metode ini tidak mengubah objek yang dipanggil. Kode yang benar akan terlihat seperti ini:

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

"Tepat. Aku sudah melakukannya, tapi aku bahkan tidak mengerti apa yang salah. Terima kasih atas penjelasannya!"

Lupa menginisialisasi objek yang merupakan elemen dari array

"Kesalahan umum lainnya adalah lupa menginisialisasi variabel array. Contoh:

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

"Kode ini tidak akan berfungsi: Anda perlu menyetel variabel larik secara eksplisit sama dengan referensi ke objek penampung yang akan menyimpan elemen larik. Versi yang benar:

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

Menggunakan variabel lokal alih-alih variabel instan.

"Pemula tidak suka memberikan nama variabel yang panjang dan bermakna."

"Betul sekali. Untuk menyelesaikan sesuatu dengan cepat, terkadang saya memberi nama variabel seperti a, b, dan i."

"Jangan lakukan itu. Itu hal yang kejam untuk dilakukan ketika kode memiliki beberapa variabel seperti itu:

Masukkan angka 99 ke dalam 100 sel array
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;
    }
  }
}

"Jauh lebih sulit membuat kesalahan dalam kode dengan nama yang tepat. Versi yang benar terlihat seperti ini:

Masukkan angka 99 ke dalam 100 sel array
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;
      }
   }
}

Menghapus item koleksi

"Apakah kamu sudah melihat-lihat koleksi?"

"Secara harfiah hanya dengan satu mata."

"Jika Anda tidak tahu apa yang saya bicarakan, buatlah catatan untuk diri Anda sendiri untuk melihat ke masa depan. Sangat sering ada situasi ketika elemen tertentu perlu dihapus dari koleksi. Kodenya terlihat seperti ini 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);

"Kode ini tidak akan berfungsi, karena Anda tidak dapat menggunakan for-eachloop untuk melintasi elemen koleksi secara bersamaan dan memodifikasi koleksi tersebut.

"Ada beberapa solusi. Pertama, Anda dapat melintasi satu koleksi dan mengubah yang lain:

Solusi 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 memiliki removeIf()metode, di mana Anda dapat memberikan aturan (fungsi lambda) yang menunjukkan elemen mana yang akan dihapus. Contoh:

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

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

Menempatkan beberapa kelas dengan publicpengubah ke dalam satu file

"Hanya ada satu kelas publik dalam sebuah file. Lebih banyak kelas dapat dideklarasikan dalam sebuah file, tetapi mereka harus menjadi kelas dalam dari kelas publik, atau tidak memiliki pengubah. Contoh public:

Isi file Solution.java Catatan
public class Solution
{
}
public class Main
{
}
Ini tidak diperbolehkan: dua kelas publik dalam satu file.
public class Solution
{
}
class Main
{
}
Tapi Anda bisa melakukan ini. Kelas Utama tidak bersifat publik
public class Solution
{
  public static class Main
  {
  }
}
Dan Anda bisa melakukan ini. Kelas Utama adalah kelas bersarang

Memanggil metode kelas biasa (non-statis) dari main()metode statis

"Terkadang pemrogram pemula mencoba mengakses variabel dan metode non-statis dari main()metode atau metode statis lainnya. Kode seperti itu tentu saja tidak akan berfungsi.

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

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

" mainMetode ini hanya dapat merujuk ke metode/variabel statis. Yah, atau pertama-tama harus membuat instance kelas Solution, dan baru kemudian memanggil metode non-statis dari objek itu. Contoh:

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

Mendeklarasikan konstruktor seperti metode

"Kesalahan umum lainnya adalah salah mendeklarasikan konstruktor kelas. Nama konstruktor harus sama dengan nama kelas, dan konstruktor tidak memiliki tipe hasil. Kesalahan paling umum terlihat seperti ini:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}
Seharusnya tidak ada tipe pengembalian di sini
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}
Nama konstruktor tidak valid. Itu harus sesuai dengan nama kelas
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this hilang. Variabel valueakan ditugaskan untuk dirinya sendiri
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
Itu semua benar.

Warisan antarmuka yang salah

"Pencipta Java mencoba membuatnya sangat dekat dengan bahasa Inggris, jadi mereka memilih kata kunci yang berbeda untuk konsep terkait tertentu.

Saat kelas mewarisi kelas, Anda harus menggunakan extendskata kunci:

class Pet
{
}

class Cat extends Pet
{
}

"Saat kelas mewarisi antarmuka, atau, lebih tepatnya, mengimplementasikannya, Anda perlu menggunakan kata implementskunci:

interface Meow
{
}

class Cat implements Meow
{
}

"Saat antarmuka mewarisi antarmuka, gunakan extendskata kunci:

interface Meow
{
}

interface Voice extends Meov
{
}

Mengabaikan breakdalam switchpernyataan

"Dan kesalahan terakhir untuk hari ini, tetapi bukan yang terakhir untuk pemula, adalah gagal memasukkan pernyataan breakdalam switchpernyataan. Contoh:

Salah Benar
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;
}

"Kamu tahu, Diego... Dilihat dari serangkaian kesalahan yang kamu tampilkan di sini, rasanya seperti kamu sedang membaca jurnal pribadiku... Atau kamu sedang melihatku menyelesaikan tugas."

"Ha! Jangan ragu. Saya telah membaca, melacak, dan terus melakukannya. Jadi waspadalah!"

"???"

"Jangan khawatir. Aku hanya bercanda. Waspada dan kurangi kesalahan bodoh."