Σε αυτό το σεμινάριο, θα μάθουμε για τη δήλωση ισχυρισμού Java (ισχυρισμοί Java) με τη βοήθεια παραδειγμάτων.
Οι ισχυρισμοί στην Java βοηθούν στον εντοπισμό σφαλμάτων με τον έλεγχο κώδικα που υποθέτουμε ότι είναι αληθινοί.
Ένας ισχυρισμός γίνεται χρησιμοποιώντας τη assert
λέξη-κλειδί.
Η σύνταξή του είναι:
assert condition;
Εδώ, condition
είναι μια δυαδική έκφραση που υποθέτουμε ότι είναι αληθινή όταν εκτελείται το πρόγραμμα.
Ενεργοποίηση ισχυρισμών
Από προεπιλογή, οι ισχυρισμοί απενεργοποιούνται και αγνοούνται κατά το χρόνο εκτέλεσης.
Για να ενεργοποιήσουμε τους ισχυρισμούς, χρησιμοποιούμε:
java -ea:arguments
Ή
java -enableassertions:arguments
Όταν οι ισχυρισμοί είναι ενεργοποιημένοι και η συνθήκη είναι true
, το πρόγραμμα εκτελείται κανονικά.
Αλλά αν η συνθήκη αξιολογηθεί έως false
ότου είναι ενεργοποιημένοι οι ισχυρισμοί, το JVM ρίχνει ένα AssertionError
και το πρόγραμμα σταματά αμέσως.
Παράδειγμα 1: Ισχυρισμός 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"); ) )
Παραγωγή
Υπάρχουν 3 Σαββατοκύριακα σε μια εβδομάδα
Λαμβάνουμε την παραπάνω έξοδο επειδή αυτό το πρόγραμμα δεν έχει σφάλματα συλλογής και από προεπιλογή, οι ισχυρισμοί είναι απενεργοποιημένοι.
Μετά την ενεργοποίηση των ισχυρισμών, λαμβάνουμε την ακόλουθη έξοδο:
Εξαίρεση στο νήμα "main" java.lang.AssertionError
Μια άλλη μορφή δήλωσης ισχυρισμού
assert condition : expression;
Σε αυτήν τη μορφή δήλωσης ισχυρισμού, μια έκφραση μεταβιβάζεται στον κατασκευαστή του AssertionError
αντικειμένου. Αυτή η έκφραση έχει μια τιμή που εμφανίζεται ως το μήνυμα λεπτομερειών του σφάλματος, εάν είναι η συνθήκη false
.
Το λεπτομερές μήνυμα χρησιμοποιείται για τη σύλληψη και τη μετάδοση των πληροφοριών σχετικά με την αποτυχία του ισχυρισμού που βοηθά στην αντιμετώπιση του προβλήματος.
Παράδειγμα 2: Ισχυρισμός Java με παράδειγμα έκφρασης
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"); ) )
Παραγωγή
Εξαίρεση στο νήμα "main" java.lang.AssertionError: Υπάρχουν μόνο 2 Σαββατοκύριακα την εβδομάδα
Όπως βλέπουμε από το παραπάνω παράδειγμα, η έκφραση μεταβιβάζεται στον κατασκευαστή του AssertionError
αντικειμένου. Εάν η υπόθεσή μας είναι false
και οι ισχυρισμοί είναι ενεργοποιημένοι, μια εξαίρεση ρίχνεται με ένα κατάλληλο μήνυμα.
Αυτό το μήνυμα βοηθά στη διάγνωση και τη διόρθωση του σφάλματος που προκάλεσε την αποτυχία του ισχυρισμού.
Ενεργοποίηση ισχυρισμού για συγκεκριμένες κατηγορίες και πακέτα
Εάν δεν παρέχουμε ορίσματα στους διακόπτες γραμμής εντολών ισχυρισμού,
java -ea
Αυτό επιτρέπει ισχυρισμούς σε όλες τις κατηγορίες εκτός από τις κλάσεις συστήματος
Μπορούμε επίσης να ενεργοποιήσουμε τον ισχυρισμό για συγκεκριμένες τάξεις και πακέτα χρησιμοποιώντας ορίσματα. Τα ορίσματα που μπορούν να παρασχεθούν σε αυτούς τους διακόπτες γραμμής εντολών είναι:
Ενεργοποίηση ισχυρισμού σε ονόματα τάξεων
Για να ενεργοποιήσετε τον ισχυρισμό για όλες τις τάξεις του προγράμματος μας Main,
java -ea Main
Για να ενεργοποιήσετε μόνο μία τάξη,
java -ea:AnimalClass Main
Αυτό επιτρέπει τον ισχυρισμό μόνο AnimalClass
στο Main
πρόγραμμα.
Ενεργοποιήστε τον ισχυρισμό σε ονόματα πακέτων
Για να ενεργοποιήσετε ισχυρισμούς για πακέτο com.animal
και μόνο τα υπο-πακέτα,
java -ea:com.animal… Main
Ενεργοποιήστε τον ισχυρισμό σε πακέτα χωρίς όνομα
Για να ενεργοποιήσετε τον ισχυρισμό σε πακέτα χωρίς όνομα (όταν δεν χρησιμοποιούμε δήλωση πακέτου) στον τρέχοντα κατάλογο εργασίας.
java -ea:… Main
Ενεργοποίηση του ισχυρισμού σε κλάσεις συστήματος
Για να ενεργοποιήσουμε τον ισχυρισμό σε κλάσεις συστήματος, χρησιμοποιούμε έναν διαφορετικό διακόπτη γραμμής εντολών:
java -esa:arguments
Ή
java -enablesystemassertions:arguments
Τα επιχειρήματα που μπορούν να παρασχεθούν σε αυτούς τους διακόπτες είναι τα ίδια.
Απενεργοποίηση ισχυρισμών
Για να απενεργοποιήσουμε τους ισχυρισμούς, χρησιμοποιούμε:
java -da arguments
Ή
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.
Εάν ο ισχυρισμός είναι ενεργοποιημένος, το πρόγραμμα λειτουργεί καλά. Ωστόσο, εάν οι ισχυρισμοί είναι απενεργοποιημένοι, τα στοιχεία από τη λίστα δεν καταργούνται. Αυτό μπορεί να οδηγήσει σε αποτυχία του προγράμματος.
Αντ 'αυτού, αντιστοιχίστε το αποτέλεσμα σε μια μεταβλητή και, στη συνέχεια, χρησιμοποιήστε αυτήν τη μεταβλητή για επιβεβαίωση.
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;
Με αυτόν τον τρόπο, μπορούμε να διασφαλίσουμε ότι όλα τα σαββατοκύριακα καταργούνται από τις καθημερινές ανεξάρτητα από τον ισχυρισμό ότι είναι ενεργοποιημένος ή απενεργοποιημένος. Ως αποτέλεσμα, δεν επηρεάζει τη λειτουργία του προγράμματος στο μέλλον.