java
Dalam tutorial ini, kita akan belajar tentang pernyataan Java assert (Java assertions) dengan bantuan contoh.
Pernyataan di Java membantu mendeteksi bug dengan menguji kode yang kami anggap benar.
Pernyataan dibuat menggunakan assert
kata kunci.
Sintaksnya adalah:
assert condition;
Di sini, condition
adalah ekspresi boolean yang kita anggap benar ketika program dijalankan.
Secara default, pernyataan dinonaktifkan dan diabaikan saat runtime.
Untuk mengaktifkan pernyataan, kami menggunakan:
java -ea:arguments
ATAU
java -enableassertions:arguments
Saat pernyataan diaktifkan dan kondisinya true
, program dijalankan secara normal.
Tetapi jika kondisinya mengevaluasi ke false
saat pernyataan diaktifkan, JVM melempar AssertionError
, dan program akan segera berhenti.
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length == 2;
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Keluaran
There are 3 weekends in a week
Kami mendapatkan output di atas karena program ini tidak memiliki kesalahan kompilasi dan secara default, pernyataan dinonaktifkan.
Setelah mengaktifkan pernyataan, kami mendapatkan output berikut:
Exception in thread "main" java.lang.AssertionError
assert condition : expression;
Dalam bentuk pernyataan pernyataan ini, sebuah ekspresi diteruskan ke konstruktor AssertionError
obyek. Ekspresi ini memiliki nilai yang ditampilkan sebagai pesan detail kesalahan jika kondisinya false
.
Pesan terperinci digunakan untuk menangkap dan mengirimkan informasi kegagalan pernyataan untuk membantu dalam men-debug masalah.
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length==2 : "There are only 2 weekends in a week";
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
Keluaran
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Seperti yang kita lihat dari contoh di atas, ekspresi diteruskan ke konstruktor AssertionError
obyek. Jika asumsi kita adalah false
dan pernyataan diaktifkan, pengecualian ditampilkan dengan pesan yang sesuai.
Pesan ini membantu dalam mendiagnosis dan memperbaiki kesalahan yang menyebabkan pernyataan gagal.
Jika kami tidak memberikan argumen apa pun ke sakelar baris perintah pernyataan,
java -ea
Ini memungkinkan pernyataan di semua kelas kecuali kelas sistem.
Kami juga dapat mengaktifkan pernyataan untuk kelas dan paket tertentu menggunakan argumen. Argumen yang dapat diberikan untuk sakelar baris perintah ini adalah:
Aktifkan pernyataan dalam nama kelas
Untuk mengaktifkan pernyataan untuk semua kelas dari program Utama kami,
java -ea Main
Untuk mengaktifkan hanya satu kelas,
java -ea:AnimalClass Main
Ini memungkinkan pernyataan hanya dalam AnimalClass
di Main
program.
Aktifkan pernyataan dalam nama paket
Untuk mengaktifkan pernyataan untuk paket com.animal
dan sub-paketnya saja,
java -ea:com.animal... Main
Aktifkan pernyataan dalam paket tanpa nama
Untuk mengaktifkan pernyataan dalam paket tanpa nama (bila kita tidak menggunakan pernyataan paket) di direktori kerja saat ini.
java -ea:... Main
Aktifkan pernyataan di kelas sistem
Untuk mengaktifkan pernyataan di kelas sistem, kami menggunakan sakelar baris perintah yang berbeda:
java -esa:arguments
ATAU
java -enablesystemassertions:arguments
Argumen yang dapat diberikan ke sakelar ini adalah sama.
Untuk menonaktifkan pernyataan, kami menggunakan:
java -da arguments
ATAU
java -disableassertions arguments
Untuk menonaktifkan pernyataan di kelas sistem, kami menggunakan:
java -dsa:arguments
ATAU
java -disablesystemassertions:arguments
Argumen yang dapat diteruskan saat menonaktifkan pernyataan sama dengan saat mengaktifkannya.
Kode yang tidak dapat dijangkau adalah kode yang tidak dieksekusi saat kita mencoba menjalankan program. Gunakan pernyataan untuk memastikan kode yang tidak dapat dijangkau sebenarnya tidak dapat dijangkau.
Mari kita ambil contoh.
void unreachableCodeMethod() {
System.out.println("Reachable code");
return;
// Unreachable code
System.out.println("Unreachable code");
assert false;
}
Mari kita ambil contoh lain dari pernyataan switch tanpa kasus default.
switch (dayOfWeek) {
case "Sunday":
System.out.println("It’s Sunday!");
break;
case "Monday":
System.out.println("It’s Monday!");
break;
case "Tuesday":
System.out.println("It’s Tuesday!");
break;
case "Wednesday":
System.out.println("It’s Wednesday!");
break;
case "Thursday":
System.out.println("It’s Thursday!");
break;
case "Friday":
System.out.println("It’s Friday!");
break;
case "Saturday":
System.out.println("It’s Saturday!");
break;
}
Pernyataan sakelar di atas menunjukkan bahwa hari dalam seminggu hanya dapat menjadi salah satu dari 7 nilai di atas. Tidak memiliki kasus default berarti programmer percaya bahwa salah satu kasus ini akan selalu dieksekusi.
Namun, mungkin ada beberapa kasus yang belum dipertimbangkan di mana asumsi tersebut sebenarnya salah.
Asumsi ini harus diperiksa menggunakan pernyataan untuk memastikan bahwa kasus sakelar default tidak tercapai.
default:
assert false: dayofWeek + " is invalid day";
Jika hariPekan memiliki nilai selain hari yang valid, sebuah AssertionError
dilempar.
Untuk mendokumentasikan asumsi yang mendasarinya, banyak programmer menggunakan komentar. Mari kita ambil contoh.
if (i % 2 == 0) {
...
} else { // We know (i % 2 == 1)
...
}
Gunakan pernyataan sebagai gantinya.
Komentar dapat menjadi kedaluwarsa dan tidak sinkron seiring bertambahnya program. Namun, kami akan dipaksa untuk memperbarui assert
pernyataan; jika tidak, mereka mungkin gagal untuk kondisi yang valid juga.
if (i % 2 == 0) {
...
} else {
assert i % 2 == 1 : i;
...
}
Argumen dalam metode publik dapat diberikan oleh pengguna.
Jadi, jika pernyataan digunakan untuk memeriksa argumen ini, kondisinya mungkin gagal dan menghasilkan AssertionError
.
Alih-alih menggunakan pernyataan, biarkan itu menghasilkan pengecualian runtime yang sesuai dan tangani pengecualian ini.
Jangan memanggil metode atau mengevaluasi pengecualian yang nantinya dapat memengaruhi operasi program dalam kondisi asersi.
Mari kita ambil contoh daftar hari kerja yang berisi nama-nama semua hari dalam seminggu.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
assert weekdays.removeAll(weekends);
Di sini, kami mencoba untuk menghapus elemen Saturday
dan Sunday
dari ArrayList hari kerja .
Jika pernyataan diaktifkan, program berfungsi dengan baik. Namun, jika pernyataan dinonaktifkan, elemen dari daftar tidak akan dihapus. Hal ini dapat mengakibatkan kegagalan program.
Sebagai gantinya, tetapkan hasilnya ke variabel dan kemudian gunakan variabel itu untuk pernyataan.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;
Dengan cara ini, kami dapat memastikan bahwa semua akhir pekan dihapus dari hari kerja terlepas dari pernyataan yang diaktifkan atau dinonaktifkan. Akibatnya, tidak mempengaruhi operasi program di masa mendatang.
java
Java LinkedList Dalam tutorial ini, kita akan belajar tentang Java LinkedList secara detail dengan bantuan contoh. LinkedList kelas kerangka koleksi Java menyediakan fungsionalitas struktur data daftar tertaut (daftar tertaut ganda). Setiap elemen dalam daftar tertaut dikenal sebagai simpul . In
Java ArrayDeque Dalam tutorial ini, kita akan belajar tentang kelas ArrayDeque dan metodenya dengan bantuan contoh. Selain itu, kita akan belajar menggunakan deque array untuk mengimplementasikan tumpukan. Di Java, kita bisa menggunakan ArrayDeque class untuk mengimplementasikan struktur data antr
Antrian Pemblokiran Java Dalam tutorial ini, kita akan belajar tentang antarmuka Java BlockingQueue dan metodenya. BlockingQueue antarmuka Java Collections framework memperluas Queue antarmuka. Ini memungkinkan operasi apa pun untuk menunggu hingga berhasil dilakukan. Misalnya, jika kita ingin me
Java ArrayBlockingQueue Dalam tutorial ini, kita akan belajar tentang kelas ArrayBlockingQueue dan metodenya dengan bantuan contoh. ArrayBlockingQueue class framework Java Collections menyediakan implementasi antrian pemblokiran menggunakan array. Ini mengimplementasikan antarmuka Java BlockingQu