English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo tutorial, impareremo Java assert statement (Java assertion) con l'aiuto di esempi.
In Java, l'assertion aiuta a rilevare gli errori testando il codice che riteniamo corretto.
Usare il chiave assert per l'assertion.
La sua sintassi è:
assert condition;
Qui condition è un'espressione booleana, supponiamo che sia vera durante l'esecuzione del programma.
Per default, l'assertion è disabilitata durante l'esecuzione e ignorata.
Per abilitare l'assertion, usiamo:
java -ea:arguments
O
java -enableassertions:arguments
Se l'assertion è abilitata e la condizione è true, il programma esegue normalmente.
Ma se la condizione calcolata è false quando l'assertion è abilitata, il JVM solleva un AssertionError e il programma si ferma immediatamente.
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("Questa settimana ci sono " + weekends.length + " fine settimana"); } }
Risultato di output
Questa settimana ci sono 3 weekend
Otteniamo il seguente output perché il programma non ha errori di compilazione e le assertioni sono disabilitate di default.
Dopo aver abilitato l'assertione, otteniamo il seguente output:
Exception in thread "main" java.lang.AssertionError
assert condition : expression;
In questa forma di istruzione di assertione, l'espressione viene passata al costruttore dell'oggetto AssertionError. Se la condizione è false, il valore dell'espressione viene visualizzato come dettaglio di errore.
Messaggi dettagliati per catturare e trasmettere informazioni sul fallimento delle assertioni per aiutare a debuggare i problemi.
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"); } }
Risultato di output
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Dallo esempio sopra, si può vedere che l'espressione viene passata al costruttore dell'oggetto AssertionError. Se l'ipotesi è corretta false e l'assertione è abilitata, viene lanciata un'eccezione e visualizzata una messaggio appropriato.
Questo messaggio aiuta a diagnosticare e correggere gli errori che causano il fallimento delle assertioni.
Se non forniamo alcun parametro al switch di riga di comando dell'assertione
java -ea
Questo abilita l'assertione in tutte le classi tranne quelle di sistema.
Possiamo anche abilitare l'assertione per classi e pacchetti specifici utilizzando i parametri. I parametri che possono essere forniti a questi switch di riga di comando sono:
Abilitare l'assertione nel nome della classe
Per abilitare l'assertione per tutte le classi del programma Main
java -ea Main
Abilitare solo una classe
java -ea:AnimalClass Main
Questo permette di utilizzare l'assertione solo nella classe AnimalClass del programma Main.
Abilitare l'assertione nel nome del pacchetto
Attivare l'assertione per il pacchetto com.animal e i suoi sottopacchetti
java -ea:com.animal... Main
Abilitare l'assert nel package senza nome
Abilitare l'assert nel package senza nome nel directory di lavoro corrente (quando non usiamo la frase package).
java -ea:... Main
Abilitare l'assert nel sistema di classi
Per abilitare l'assert nel sistema di classi, usiamo diversi switch di riga di comando:
java -esa:arguments
o
java -enablesystemassertions:arguments
I parametri che possono essere forniti a questi switch sono gli stessi.
Per disabilitare l'assert, usiamo:
java -da arguments
o
java -disableassertions arguments
Per disabilitare l'assert nel sistema di classi, usiamo:
java -dsa:arguments
o
java -disablesystemassertions:arguments
I parametri che possono essere passati quando l'assert è disabilitato sono gli stessi di quando è abilitato.
Rileva e corregge rapidamente e efficacemente gli errori.
L'assertions check sono eseguiti solo durante la sviluppo e il test. Vengono automaticamente rimossi dal codice di produzione durante l'esecuzione, quindi non rallentano la velocità di esecuzione del programma.
Aiuta a rimuovere il codice di esempio e rendere il codice più leggibile.
Ristrutturare e ottimizzare il codice per aumentare la fiducia nella sua esecuzione corretta.
Il codice non raggiungibile è il codice che non viene eseguito quando proviamo a eseguire il programma. Utilizziamo l'assert per assicurare che il codice non raggiungibile sia effettivamente non raggiungibile.
Facciamo un esempio.
void unreachableCodeMethod() { System.out.println(\ return; // Codice non raggiungibile System.out.println(\ assert false; }
Ecco un esempio di frase switch senza caso predefinito.
case \ break; case \ break; case \ break; case \ System.out.println("È mercoledì!"); break; case "Thursday": System.out.println("È giovedì!"); break; case "Friday": System.out.println("È venerdì!"); break; case "Saturday": System.out.println("È sabato!"); break; }
La frase switch sopra indica che i giorni della settimana possono essere uno dei 7 valori elencati. La mancanza di una condizione di default significa che il programmatore crede che una di queste condizioni verrà sempre eseguita.
Ma in alcuni casi di ipotesi che sono effettivamente errati, alcune situazioni potrebbero non essere state considerate.
Dovrebbe essere utilizzata l'assert per controllare questa ipotesi per assicurarsi che non si raggiunge la condizione di switch di default.
default: assert false : dayofWeek + " è un giorno non valido";
Se il valore di dayOfWeek non è una data valida, lanciare AssertionError.
Per registrare le loro ipotesi di base, molti programmatori utilizzano i commenti. Facciamo un esempio.
else { ... else { // Sappiamo che (i % 2 == 1) ... }
Utilizzare invece l'assert.
Con la crescita del programma, i commenti potrebbero diventare obsoleti e non sincronizzati. Tuttavia, dovremo aggiornare le istruzioni assert; altrimenti, potrebbero fallire anche a causa di condizioni valide.
else { ... } assert i % 2 == 1 : i; ... }
Gli utenti possono fornire parametri nelle metodologie pubbliche.
Di conseguenza, se si utilizzano assert per controllare questi parametri, le condizioni potrebbero fallire e causare AssertionError.
Piuttosto che utilizzare assert, è meglio far sì che venga generata un'eccezione di runtime appropriata e gestire queste eccezioni.
Non chiamare metodi o valutare eccezioni che potrebbero influenzare l'operazione del programma nelle condizioni di assertione.
Prendiamo un esempio di elenco, la lista weekdays contiene i nomi di tutti i giorni della settimana.
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);
Qui, cerchiamo di rimuovere gli elementi Saturday e Sunday dall'ArrayList weekdays.
Se l'assertione è attivata, il programma può funzionare correttamente. Tuttavia, se l'assertione è disattivata, non verranno rimossi gli elementi dalla lista. Questo potrebbe portare al fallimento del programma.
Invece, assegniamo il risultato a una variabile e utilizziamo quella variabile per l'assert.
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;
In questo modo, possiamo assicurarci che vengano rimossi tutti i fine settimana da weekdays, senza considerare l'abilitazione o la disabilitazione degli assert. Di conseguenza, non influenzerà le operazioni future del programma.