Dalam tutorial ini, kita akan belajar mengenai pernyataan penegasan Java (penegasan Java) dengan bantuan contoh.
Tegasan di Java membantu mengesan pepijat dengan menguji kod yang kita anggap benar.
Penegasan dibuat menggunakan assert
kata kunci.
Sintaksnya adalah:
assert condition;
Di sini, condition
adalah ungkapan boolean yang kami anggap benar ketika program dijalankan.
Mendayakan Tegasan
Secara lalai, penegasan dilumpuhkan dan tidak diendahkan pada waktu proses.
Untuk membolehkan penegasan, kami menggunakan:
java -ea:arguments
ATAU
java -enableassertions:arguments
Apabila penegasan diaktifkan dan keadaannya true
, program dijalankan seperti biasa.
Tetapi jika keadaan dinilai false
sementara penegasan diaktifkan, JVM membuang AssertionError
, dan program berhenti serta-merta.
Contoh 1: Penegasan 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"); ) )
Pengeluaran
Terdapat 3 hujung minggu dalam seminggu
Kami mendapat output di atas kerana program ini tidak mempunyai kesalahan kompilasi dan secara lalai, penegasan dilumpuhkan.
Setelah mengaktifkan penegasan, kami mendapat output berikut:
Pengecualian dalam java.lang.AssertionError utas "utama"
Satu lagi bentuk pernyataan penegasan
assert condition : expression;
Dalam bentuk pernyataan penegasan ini, ungkapan diteruskan kepada pembina AssertionError
objek. Ungkapan ini mempunyai nilai yang ditampilkan sebagai mesej terperinci ralat jika keadaannya false
.
Mesej terperinci digunakan untuk menangkap dan menghantar maklumat kegagalan penegasan untuk membantu menyelesaikan masalah.
Contoh 2: Penegasan Java dengan contoh ungkapan
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"); ) )
Pengeluaran
Pengecualian dalam utas "main" java.lang.AssertionError: Hanya ada 2 hujung minggu dalam seminggu
Seperti yang kita lihat dari contoh di atas, ungkapan diteruskan ke pembina AssertionError
objek. Sekiranya andaian kami false
dan penegasan diaktifkan, pengecualian dilemparkan dengan mesej yang sesuai.
Mesej ini membantu dalam mendiagnosis dan memperbaiki ralat yang menyebabkan penegasan gagal.
Mengaktifkan penegasan untuk kelas dan pakej tertentu
Sekiranya kita tidak memberikan hujah kepada peralihan baris perintah penegasan,
jawa -ea
Ini membolehkan penegasan di semua kelas kecuali kelas sistem.
Kami juga boleh membenarkan penegasan untuk kelas dan pakej tertentu menggunakan argumen. Argumen yang dapat diberikan kepada suis baris perintah ini adalah:
Dayakan penegasan dalam nama kelas
Untuk membolehkan penegasan untuk semua kelas Utama program kami,
java -ea Main
Untuk membolehkan satu kelas sahaja,
java -ea:AnimalClass Main
Ini membolehkan penegasan hanya AnimalClass
dalam Main
program.
Dayakan penegasan dalam nama pakej
Untuk membolehkan pernyataan untuk pakej com.animal
dan sub-pakejnya sahaja,
java -ea:com.animal… Main
Dayakan penegasan dalam pakej tanpa nama
Untuk mengaktifkan penegasan dalam pakej yang tidak disebutkan namanya (apabila kita tidak menggunakan pernyataan pakej) dalam direktori yang berfungsi sekarang.
java -ea:… Main
Dayakan penegasan dalam kelas sistem
Untuk membolehkan penegasan dalam kelas sistem, kami menggunakan suis baris perintah yang berbeza:
java -esa:arguments
ATAU
java -enablesystemassertions:arguments
Argumen yang dapat diberikan kepada suis ini adalah sama.
Melumpuhkan Tegasan
Untuk melumpuhkan 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.
Sekiranya penegasan diaktifkan, program ini berfungsi dengan baik. Walau bagaimanapun, jika penegasan dilumpuhkan, elemen dari senarai tidak akan dikeluarkan. Ini boleh mengakibatkan kegagalan program.
Sebaliknya, berikan hasilnya kepada pemboleh ubah dan kemudian gunakan pemboleh ubah tersebut untuk penegasan.
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, kita dapat memastikan bahawa semua hujung minggu dikeluarkan dari hari bekerja tanpa mengira penegasan diaktifkan atau dinyahaktifkan. Kesannya, ia tidak akan mempengaruhi operasi program pada masa akan datang.