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);
}
È stato utile?

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 è un assert 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 restituisce false.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.

JavaDoc

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top