English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java Controllo dei flussi

Java Array

Java Orientazione agli oggetti (I)

Java Orientazione agli oggetti (II)

Java Orientazione agli oggetti (III)

Java 异常处理

Java List

Java Queue (Coda)

Java Map Collection

Java Set Collection

Java Input/Output (I/O)

Java Reader/Writer

Altri argomenti Java

Java 断言(Assert)

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.

Abilitare l'assertion

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.

Esempio 1: Assert Java

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

Altra forma di dichiarazione di assertione

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.

Esempio 2: Esempio Java di assertione con espressione

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.

Abilitare l'assertione per classi e pacchetti specifici

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.

Disabilitare l'assert

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.

Vantaggi dell'assert

  1. Rileva e corregge rapidamente e efficacemente gli errori.

  2. 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.

  3. Aiuta a rimuovere il codice di esempio e rendere il codice più leggibile.

  4. Ristrutturare e ottimizzare il codice per aumentare la fiducia nella sua esecuzione corretta.

Quando utilizzare l'assert

1. Codice non raggiungibile

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.

2. Registrazione delle ipotesi

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;
    ...
}

Quando non utilizzare assert

1. Controllo dei parametri nelle metodologie pubbliche

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.

2. Valutazione delle espressioni che influenzano l'operazione del programma

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.