Blocco di codice per Asserzioni

di il
4 risposte

Blocco di codice per Asserzioni

Buongiorno, un dubbio che deriva dallo studio del De Cesari Sio. Introduce un blocco statico che serve a imporre che le asserzioni siano abilitate:

static {
boolean assertsEnabled = false;
assert assertsEnabled = true;
if (!assertsEnabled)
throw new RuntimeException("Asserts must be enabled! ");
}
allora all'inizio crea la variabile booleana assertsEnabled, inizializzata a false. Poi dice che il programma deve avere assertsEnabled= true, altrimenti lancia la RuntimeException. Due domande:

1. che cosa succede tra la riga
boolean assertsEnabled=false
e
assert assertsEnabled = true;
? Perchè dovrebbe cambiare il valore booleano della variabile?

2.metterci la RuntimeException serve perchè non avrebbe senso mettere
assert assertsEnabled = true:"Asserts must be enabled! ";
dato che se le asserzioni fossero disabilitate non mi ritornerebbe questo messaggio, giusto?

4 Risposte

  • Re: Blocco di codice per Asserzioni

    ciamba87 ha scritto:


    1. che cosa succede tra la riga
    boolean assertsEnabled=false
    
    e
    assert assertsEnabled = true;
    ? Perchè dovrebbe cambiare il valore booleano della variabile?

    2.metterci la RuntimeException serve perchè non avrebbe senso mettere
    assert assertsEnabled = true:"Asserts must be enabled! ";
    Presta attenzione! Perché nella riga
    assert assertsEnabled = true;
    assertsEnabled = true è un ASSEGNAMENTO ... NON una espressione di confronto (che invece dovrebbe essere con == ).
    L'operando di assert è true, perché è il valore della variabile a cui è assegnato true. Questo vuol dire una cosa semplice:
    - Se le asserzioni sono abilitate, quella riga esiste nel codice eseguito dalla JVM e la assert NON fallisce (essendo l'operando sempre true) ma allo stesso tempo assertsEnabled viene settato a true.
    - Se le asserzioni sono disabilitate, quella riga "svanisce" completamente (in esecuzione, non compilazione!), per la JVM è come se non esistesse. E quindi assertsEnabled resta a false.
  • Re: Blocco di codice per Asserzioni

    Accipicchia mi era sfuggito "="...quindi un'assert può anche essere un comando, non solo un confronto?
    Se io mettessi
    
    assert int numero=1234;
    
    nel caso in cui fossero attive le asserzioni mi restituirebbe un numero?
  • Re: Blocco di codice per Asserzioni

    ciamba87 ha scritto:


    Accipicchia mi era sfuggito "="...quindi un'assert può anche essere un comando, non solo un confronto?
    Se io mettessi
    
    assert int numero=1234;
    
    nel caso in cui fossero attive le asserzioni mi restituirebbe un numero?
    No, la sintassi è sbagliata. Non può esserci una dichiarazione di variabile (neanche con inizializzazione). E l'operando di assert DEVE essere una qualunque espressione (lunga/complessa quanto vuoi) che dia un boolean.

    Quindi l'assegnamento come espressione nel assert è possibile solo verso una variabile boolean.
  • Re: Blocco di codice per Asserzioni

    Perfetto, capito. Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
4 risposte