HOWTO · Java
La parola chiave assert in Java
Questo articolo descrive quando e come utilizzare la parola chiave assert Java.
In questa pagina
La parola chiave assert di Java verifica un’ipotesi del programmatore; per impostazione predefinita, la JVM disabilita le asserzioni. Avvia il programma con -ea per abilitarle. Se la condizione di un’asserzione abilitata risulta falsa, Java genera un AssertionError; altrimenti, l’esecuzione prosegue. Usa le asserzioni per verificare ipotesi interne che dovrebbero essere vere durante lo sviluppo, non per operazioni che l’applicazione deve eseguire a ogni avvio.
Utilizzo di assert come condizione in Java
La forma di base è assert condition;, dove condition deve essere un’espressione booleana. Se le asserzioni sono abilitate e l’espressione è falsa, Java genera un AssertionError nel punto in cui si trova l’asserzione. Se sono disabilitate, la JVM salta l’asserzione senza valutare la condizione. Per questo la condizione non deve eseguire operazioni da cui dipende il programma.
Questa classe completa controlla un conteggio e stampa un breve risultato.
public class JavaAssertCheck {
public static void main(String[] args) {
String[] names = {"John", "Mary", "David"};
assert names.length == 3;
System.out.println("Name count: " + names.length);
}
}
Compila la classe, quindi eseguila con java -ea JavaAssertCheck per abilitare il controllo. Se la esegui senza -ea, il controllo viene saltato. Se modifichi il conteggio atteso impostandolo su un valore diverso da quello degli elementi dell’array e abiliti le asserzioni, il programma si interrompe sull’asserzione generando un AssertionError.
Utilizzo di assert condition : expression in Java
Usa assert condition : expression quando vuoi che un errore includa informazioni utili per capirne il contesto. L’espressione viene valutata solo se le asserzioni sono abilitate e la condizione è falsa; il suo valore diventa il messaggio di dettaglio dell’AssertionError generato. Per esempio, assert names.length == expected : "Expected " + expected + " names, got " + names.length; indica entrambi i conteggi. Evita effetti collaterali nell’espressione: non viene valutata se la condizione è vera o se le asserzioni sono disabilitate.
Usare assert per segnalare un ramo imprevisto
Un’asserzione può segnalare un ramo che, secondo la logica del programma, non dovrebbe mai essere raggiunto. Java rifiuta un’istruzione collocata dopo un return incondizionato; inserisci quindi l’asserzione in un ramo che il compilatore non può dimostrare irraggiungibile:
public class StatusLabel {
static String label(int status) {
if (status == 0) {
return "ready";
} else if (status == 1) {
return "busy";
} else {
assert false : "Unexpected status: " + status;
return "unknown";
}
}
public static void main(String[] args) {
System.out.println(label(0));
}
}
Se le asserzioni sono abilitate, raggiungere il ramo finale genera un AssertionError che include lo stato come contesto. Se sono disabilitate, l’esecuzione raggiunge l’istruzione return di ripiego: l’asserzione serve quindi come aiuto diagnostico e non come parte necessaria del flusso di controllo.
Usare le asserzioni in sicurezza per gli invarianti interni
Le asserzioni sono utili per documentare un invariante stabilito dal programma stesso, per esempio che un valore resti entro un intervallo dopo un calcolo interno. Durante lo sviluppo, possono aiutare a individuare più facilmente un’ipotesi non rispettata.
Non usare un’asserzione per convalidare gli argomenti ricevuti da un metodo pubblico: chi lo chiama ha bisogno di una risposta di convalida definita, indipendentemente dalle opzioni della JVM. Allo stesso modo, non inserire in un’asserzione operazioni necessarie all’applicazione, perché se le asserzioni sono disabilitate la JVM salta la condizione. Evita anche gli effetti collaterali nelle espressioni delle asserzioni, per lo stesso motivo. Quando il programma deve comportarsi in modo coerente in produzione, ricorri alla normale convalida e al flusso di controllo.