Cosa fa la parola chiave “assert”?[duplicare]
Domanda
Questa domanda ha già una risposta qui:
Cosa fa assert
Fare?Ad esempio nella funzione:
private static int charAt(String s, int d) {
assert d >= 0 && d <= s.length();
if (d == s.length()) return -1;
return s.charAt(d);
}
Soluzione
Se avvii il tuo programma con -enableassertions
(O -ea
in breve) quindi questa affermazione
assert cond;
è equivalente a
if (!cond)
throw new AssertionError();
Se avvii il programma senza questa opzione, l'istruzione assert non avrà alcun effetto.
Per esempio, assert d >= 0 && d <= s.length();
, come pubblicato nella tua domanda, è equivalente a
if (!(d >= 0 && d <= s.length()))
throw new AssertionError();
(Se hai lanciato con -enableassertions
questo è.)
Formalmente, il Specifiche del linguaggio Java:14.10.IL assert
Dichiarazione dice quanto segue:
14.10.IL
assert
Dichiarazione
Un'asserzione è unassert
istruzione contenente un'espressione booleana.Un'affermazione è abilitato o disabilitato.Se l'asserzione è abilitata, l'esecuzione dell'asserzione provoca la valutazione dell'espressione booleana e viene segnalato un errore se l'espressione restituiscefalse
.Se l'asserzione è disabilitata, l'esecuzione dell'asserzione non ha alcun effetto.
Dove "abilitato o disabilitato" è controllato con il -ea
interruttore e "È stato segnalato un errore" significa che un AssertionError
viene lanciato.
E infine, una caratteristica meno conosciuta di assert
:
Puoi aggiungere : "Error message"
come questo:
assert d != null : "d is null";
per specificare quale dovrebbe essere il messaggio di errore dell'AssertionError generato.
Questo post è stato riscritto come articolo Qui.
Altri suggerimenti
Se la condizione non è soddisfatta, verrà generato un AssertionError
.
Le asserzioni devono essere abilitati, però; altrimenti l'espressione assert
non fa nulla. Vedi:
http: // java. sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
è uno strumento di debug che farà sì che il programma per un'eccezione AssertionFailed
se la condizione non è vera. In questo caso, il programma genera un'eccezione se una delle due condizioni seguenti si restituiscono falso. In linea generale, assert
non deve essere utilizzato nel codice di produzione
Anche se ho letto un sacco di documentazione su questo, sto ancora confusione su come, quando e dove usarlo.
Lo rendono molto semplice da capire:
Quando si ha una situazione simile in questo modo:
String strA = null;
String strB = null;
if (2 > 1){
strA = "Hello World";
}
strB = strA.toLowerCase();
È possibile ricevere avviso (visualizzazione linea gialla sulla STRB = strA.toLowerCase ();) che strA potrebbe produrre un valore NULL per STRB. Anche se si sa che STRB è assolutamente non sarà nulla, alla fine, nel caso, si usa assert a
1. Disattivare l'avviso.
2. Gettare l'errore di eccezione se cosa peggiore accade (quando si esegue l'applicazione).
A volte, quando si compila il codice, non si ottiene il risultato ed è un bug. Ma l'applicazione non andrà in crash, e trascorrere un momento molto difficile trovare dove sta causando questo bug.
Quindi, se si mette affermare, in questo modo:
assert strA != null; //Adding here
strB = strA .toLowerCase();
dirvi al compilatore che strA non è assolutamente un valore nullo, si può 'pacificamente' disattivare l'allarme. Se è NULL (caso peggiore accade), si fermerà l'applicazione e lanciare un bug a voi per individuarlo.
Usa questa versione del assert per fornire un messaggio di dettaglio per l'AssertionError. Il sistema passa il valore di expression2 al costruttore AssertionError appropriata, che utilizza la rappresentazione di stringa del valore come messaggio dettagli del errore.
Lo scopo del messaggio particolare è quello di catturare e comunicare i dettagli del fallimento asserzione. Il messaggio dovrebbe consentire di diagnosticare e, infine, correggere l'errore che ha portato l'affermazione a fallire. Si noti che il messaggio di dettaglio non è un messaggio di errore a livello di utente, quindi è in genere necessario fare questi messaggi comprensibili in isolamento o di internazionalizzare loro. Il messaggio di dettaglio è pensato per essere interpretato nel contesto di una traccia stack completo, in concomitanza con il codice sorgente che contiene l'asserzione non riuscita.
Le asserzioni sono generalmente utilizzati principalmente come un mezzo di controllo comportamento previsto del programma. Esso dovrebbe portare ad un crash nella maggior parte dei casi, dal momento che le ipotesi del programmatore sullo stato del programma sono false. Questo è dove l'aspetto debug delle asserzioni entrare. Essi creano un posto di blocco che non possiamo ignorare se ci piacerebbe avere un comportamento corretto.
Nel tuo caso lo fa la convalida dei dati sui parametri in entrata, anche se non impedisce ai client di cattivo utilizzo della funzione in futuro. Soprattutto se non lo sono, (e non deve) essere inclusi nella build di rilascio.
Si assicura che l'espressione restituisce true. In caso contrario, getta una java.lang.AssertionError
.
http://java.sun.com /docs/books/jls/third_edition/html/statements.html#14.10
Assert fa gettare un AssertionError se si esegue la vostra applicazione con asserzioni acceso.
int a = 42;
assert a >= 0 && d <= 10;
Se si esegue questo con, diciamo: java -jar -ea peiska.jar
Si deve lanciare un java.lang.AssertionError