Bu eğitimde, örnekler yardımıyla Java assert ifadesi (Java iddiaları) hakkında bilgi edineceğiz.
Java'daki iddialar, doğru olduğunu varsaydığımız kodu test ederek hataları tespit etmeye yardımcı olur.
assert
Anahtar kelime kullanılarak bir iddia yapılır .
Sözdizimi şöyledir:
assert condition;
Burada, condition
program çalıştırıldığında doğru olduğunu varsaydığımız bir mantıksal ifade var.
Onayları Etkinleştirme
Varsayılan olarak, iddialar çalışma zamanında devre dışı bırakılır ve yok sayılır.
İddiaları etkinleştirmek için şunları kullanıyoruz:
java -ea:arguments
VEYA
java -enableassertions:arguments
İddialar etkinleştirildiğinde ve koşul olduğunda true
, program normal şekilde çalışır.
Ancak koşul false
, iddialar etkinleştirilirken değerlendirilirse , JVM bir atar AssertionError
ve program hemen durur.
Örnek 1: Java iddiası
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"); ) )
Çıktı
Haftada 3 hafta sonu var
Yukarıdaki çıktıyı elde ederiz çünkü bu programda derleme hatası yoktur ve varsayılan olarak iddialar devre dışı bırakılır.
İddiaları etkinleştirdikten sonra aşağıdaki çıktıyı alıyoruz:
"Main" iş parçacığında istisna java.lang.AssertionError
Başka bir iddia beyanı biçimi
assert condition : expression;
Bu iddia beyanı biçiminde, AssertionError
nesnenin yapıcısına bir ifade iletilir . Bu ifade, koşul ise hatanın ayrıntı mesajı olarak görüntülenen bir değere sahiptir false
.
Ayrıntılı mesaj, sorunun hata ayıklamasına yardımcı olmak için onaylama hatası bilgisini yakalamak ve iletmek için kullanılır.
Örnek 2: İfade örneğiyle Java iddiası
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"); ) )
Çıktı
"Main" iş parçacığında istisna java.lang.AssertionError: Haftada yalnızca 2 hafta sonu vardır
Yukarıdaki örnekten de gördüğümüz gibi, ifade AssertionError
nesnenin yapıcısına aktarılır . Varsayımımız false
ve iddialarımız etkinleştirilmişse, uygun bir mesajla bir istisna atılır.
Bu mesaj, iddianın başarısız olmasına neden olan hatanın teşhisine ve düzeltilmesine yardımcı olur.
Belirli sınıflar ve paketler için onaylamayı etkinleştirme
Onaylama komut satırı anahtarlarına herhangi bir argüman sağlamazsak,
java - ea
Bu, sistem sınıfları dışındaki tüm sınıflarda iddiaları etkinleştirir.
Bağımsız değişkenleri kullanarak belirli sınıflar ve paketler için onaylamayı da etkinleştirebiliriz. Bu komut satırı anahtarlarına sağlanabilecek argümanlar şunlardır:
Sınıf adlarında onaylamayı etkinleştir
Ana programımızın tüm sınıfları için onaylamayı etkinleştirmek için,
java -ea Main
Yalnızca bir sınıfı etkinleştirmek için,
java -ea:AnimalClass Main
Bu sadece iddiasını olanak AnimalClass
de Main
programa.
Paket adlarında onaylamayı etkinleştir
com.animal
Yalnızca paket ve alt paketleri için iddiaları etkinleştirmek için ,
java -ea:com.animal… Main
Adsız paketlerde onaylamayı etkinleştir
Geçerli çalışma dizininde adsız paketlerde (paket deyimi kullanmadığımızda) onaylamayı etkinleştirmek için.
java -ea:… Main
Sistem sınıflarında onaylamayı etkinleştir
Sistem sınıflarında onaylamayı etkinleştirmek için farklı bir komut satırı anahtarı kullanıyoruz:
java -esa:arguments
VEYA
java -enablesystemassertions:arguments
Bu anahtarlara sağlanabilecek argümanlar aynıdır.
Onayları Devre Dışı Bırakma
İddiaları devre dışı bırakmak için şunları kullanıyoruz:
java -da arguments
VEYA
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.
İddia etkinleştirilirse, program iyi çalışır. Ancak, iddialar devre dışı bırakılırsa, listedeki öğeler kaldırılmaz. Bu, programın başarısız olmasına neden olabilir.
Bunun yerine, sonucu bir değişkene atayın ve ardından bu değişkeni onaylama için kullanın.
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;
Bu şekilde, iddia etkinleştirilmiş veya devre dışı bırakılmış olsun olmasın tüm hafta sonlarının hafta içi günlerden kaldırılmasını sağlayabiliriz. Sonuç olarak, gelecekte programın çalışmasını etkilemez.