"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 if
pernyataan 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 String
objek
"Pengaturcara baru sering terlupa bahawa semua objek kelas tidak boleh diubah , dan setiap kaedah kelas String
mengembalikan 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 |
---|
|
"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 |
---|
|
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-each
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 |
---|
|
"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 |
---|
|
Meletakkan beberapa kelas dengan public
pengubah 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 |
---|---|
|
Ini tidak dibenarkan: dua kelas awam dalam satu fail. |
|
Tetapi anda boleh melakukan ini. Kelas Utama bukan awam |
|
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();
}
}
" main
Kaedah 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 |
---|---|
|
|
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:
|
Tidak sepatutnya ada jenis pemulangan di sini |
|
Nama pembina tidak sah. Ia mesti sepadan dengan nama kelas |
|
this sedang hilang. Pembolehubah value akan diberikan kepada dirinya sendiri |
|
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 extends
kata kunci:
class Pet
{
}
class Cat extends Pet
{
}
"Apabila kelas mewarisi antara muka, atau, lebih tepat lagi, melaksanakannya, anda perlu menggunakan kata implements
kunci:
interface Meow
{
}
class Cat implements Meow
{
}
"Apabila antara muka mewarisi antara muka, gunakan extends
kata kunci:
interface Meow
{
}
interface Voice extends Meov
{
}
Meninggalkan break
dalam switch
kenyataan
"Dan kesilapan terakhir untuk hari ini, tetapi bukan yang terakhir untuk pemula, adalah gagal memasukkan kenyataan break
dalam switch
kenyataan. Contoh:
salah | Betul |
---|---|
|
|
"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."
GO TO FULL VERSION