Dalam tutorial ini, kita akan belajar tentang pernyataan pernyataan Java (pernyataan Java) dengan bantuan contoh.
Assertion di Java membantu mendeteksi bug dengan menguji kode yang kami asumsikan benar.
Pernyataan dibuat dengan menggunakan assert
kata kunci.
Sintaksnya adalah:
assert condition;
Di sini, condition
adalah ekspresi boolean yang kami asumsikan benar saat program dijalankan.
Mengaktifkan Pernyataan
Secara default, pernyataan dinonaktifkan dan diabaikan pada waktu proses.
Untuk mengaktifkan pernyataan, kami menggunakan:
java -ea:arguments
ATAU
java -enableassertions:arguments
Ketika pernyataan diaktifkan dan kondisinya true
, program dijalankan secara normal.
Namun jika kondisi mengevaluasi ke false
saat pernyataan diaktifkan, JVM melontarkan AssertionError
, dan program segera berhenti.
Contoh 1: Pernyataan Java
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
Ada 3 akhir pekan dalam seminggu
Kami mendapatkan keluaran di atas karena program ini tidak memiliki kesalahan kompilasi dan secara default, pernyataan dinonaktifkan.
Setelah mengaktifkan pernyataan, kami mendapatkan keluaran berikut:
Pengecualian di thread "main" java.lang.AssertionError
Bentuk pernyataan asersi lainnya
assert condition : expression;
Dalam bentuk pernyataan pernyataan ini, ekspresi diteruskan ke konstruktor AssertionError
objek. Ekspresi ini memiliki nilai yang ditampilkan sebagai pesan detail kesalahan jika kondisinya false
.
Pesan rinci digunakan untuk menangkap dan mengirimkan informasi tentang kegagalan pernyataan untuk membantu dalam men-debug masalah.
Contoh 2: Pernyataan Java dengan contoh ekspresi
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
Pengecualian di thread "main" java.lang.AssertionError: Hanya ada 2 akhir pekan dalam seminggu
Seperti yang kita lihat dari contoh di atas, ekspresi diteruskan ke konstruktor AssertionError
objek. Jika asumsi kami adalah false
dan pernyataan diaktifkan, pengecualian dilemparkan dengan pesan yang sesuai.
Pesan ini membantu dalam mendiagnosis dan memperbaiki kesalahan yang menyebabkan pernyataan gagal.
Mengaktifkan pernyataan untuk kelas dan paket tertentu
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 ke sakelar baris perintah ini adalah:
Aktifkan pernyataan dalam nama kelas
Untuk mengaktifkan pernyataan untuk semua kelas Program Utama kami,
java -ea Main
Untuk mengaktifkan hanya satu kelas,
java -ea:AnimalClass Main
Hal ini memungkinkan pernyataan hanya AnimalClass
dalam 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 (saat kami 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 saklar baris perintah yang berbeda:
java -esa:arguments
ATAU
java -enablesystemassertions:arguments
Argumen yang dapat diberikan ke sakelar ini sama.
Menonaktifkan Pernyataan
Untuk menonaktifkan pernyataan, kami menggunakan:
java -da arguments
ATAU
java -disableassertions arguments
To disable assertion in system classes, we use:
java -dsa:arguments
OR
java -disablesystemassertions:arguments
The arguments that can be passed while disabling assertions are the same as while enabling them.
Advantages of Assertion
- Quick and efficient for detecting and correcting bugs.
- Assertion checks are done only during development and testing. They are automatically removed in the production code at runtime so that it won’t slow the execution of the program.
- It helps remove boilerplate code and make code more readable.
- Refactors and optimizes code with increased confidence that it functions correctly.
When to use Assertions
1. Unreachable codes
Unreachable codes are codes that do not execute when we try to run the program. Use assertions to make sure unreachable codes are actually unreachable.
Let’s take an example.
void unreachableCodeMethod() ( System.out.println("Reachable code"); return; // Unreachable code System.out.println("Unreachable code"); assert false; )
Let’s take another example of a switch statement without a default case.
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; )
The above switch statement indicates that the days of the week can be only one of the above 7 values. Having no default case means that the programmer believes that one of these cases will always be executed.
However, there might be some cases that have not yet been considered where the assumption is actually false.
This assumption should be checked using an assertion to make sure that the default switch case is not reached.
default: assert false: dayofWeek + " is invalid day";
If dayOfWeek has a value other than the valid days, an AssertionError
is thrown.
2. Documenting assumptions
To document their underlying assumptions, many programmers use comments. Let’s take an example.
if (i % 2 == 0) (… ) else ( // We know (i % 2 == 1)… )
Use assertions instead.
Comments can get out-of-date and out-of-sync as the program grows. However, we will be forced to update the assert
statements; otherwise, they might fail for valid conditions too.
if (i % 2 == 0) (… ) else ( assert i % 2 == 1 : i;… )
When not to use Assertions
1. Argument checking in public methods
Arguments in public methods may be provided by the user.
So, if an assertion is used to check these arguments, the conditions may fail and result in AssertionError
.
Instead of using assertions, let it result in the appropriate runtime exceptions and handle these exceptions.
2. To evaluate expressions that affect the program operation
Do not call methods or evaluate exceptions that can later affect the program operation in assertion conditions.
Let us take an example of a list weekdays which contains the names of all the days in a week.
ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); assert weekdays.removeAll(weekends);
Here, we are trying to remove elements Saturday
and Sunday
from the ArrayList weekdays.
Jika pernyataan diaktifkan, program berfungsi dengan baik. Namun, jika pernyataan dinonaktifkan, elemen dari daftar tidak dihapus. Ini dapat mengakibatkan kegagalan program.
Sebagai gantinya, tetapkan hasilnya ke variabel dan kemudian gunakan variabel itu untuk pernyataan.
ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList 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, hal tersebut tidak mempengaruhi operasional program di masa mendatang.