Asserzioni in Java fondamenti

Похожие документы
Le basi del linguaggio Java

FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Eccezioni ed asserzioni

Programmazione Java Struttura di una classe, Costruttore, Riferimento this

GESTIONE DEGLI ERRORI

Gestione delle eccezioni in Java

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Programmazione con Java

Modulo 2: Strutture fondamentali della programmazione Java

Corso sul linguaggio Java

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

RETI DI CALCOLATORI Linguaggio Java: Eccezioni

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Programmazione ad Oggetti

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Gestione delle eccezioni

STRUTTURE DI CONTROLLO DEL C++

Metodi statici. Dichiarazione e chiamata di metodi statici

Strutture di controllo decisionali

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Debug di un programma

Esempi al calcolatore su: 1) Costruttori ed ereditarietà 2) Subtyping e polimorfismo

Java il Corso Fondamentale

Algoritmi di Ricerca. Esempi di programmi Java

Ereditarietà. Ereditarietà. Ereditarietà. Ereditarietà

Programmazione Orientata agli Oggetti in Linguaggio Java

Alberi Binario in Java

Corso di Laurea Ingegneria Informatica Laboratorio di Informatica

Corso di Algoritmi e Strutture dati Programmazione Object- Oriented in Java (Parte I)

OO puro. Primi concetti di Java. Tipi primitivi. Ogni cosa è un oggetto. Java è object-oriented puro Non come il C+ + (OO ibrido) Lorenzo Bettini

Algoritmi di Ricerca. Esempi di programmi Java

5 - Istruzioni condizionali

Definizione di classi. Walter Didimo

Esempio 2: Subtyping

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Esercizi sui metodi. Carla Limongelli. Maggio Esercizi 1

osservazione: 1 MCD(m,n) min(m,n) = si provano i numeri compresi tra 1 e min(m,n) conviene iniziare da min(m,n) e scendere verso 1

Perché il linguaggio C?

Introduzione a Visual Studio 2005

Laboratorio di Programmazione Lezione 4. Cristian Del Fabbro

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

14 - Metodi e Costruttori

Le basi del linguaggio Java

Introduzione alla programmazione

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali

Programmazione web lato client con JavaScript. Marco Camurri 1

La classe java.lang.object

Classi astratte e progettazione OOP Esempio: l enciclopedia degli animali. Esempio Animali

Proprietà delle Classi e degli Oggetti in Java

Definizione di metodi in Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Costrutti iterativi. Utilizzo dei costrutti iterativi

Introduzione a Java. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi132 Sesto San Giovanni

Fondamenti di Informatica I

Primi passi col linguaggio C

Uguaglianza e copia di oggetti

Транскрипт:

Asserzioni in Java fondamenti Cosa è un asserzione? Una assertion è una espressione booleana che deve essere true se e solo se il codice sta funzionando correttamente. Se l asserzione risulta falsa, viene segnalato l errore e bisogna correggere il codice. Le asserzioni permettono di inserire un meccanismo di sanity check. Questi controlli sono utilizzati nella fase di test e sviluppo (non di produzione come le eccezioni). Il controllo delle asserzioni può essere attivato o disattivato a runtime. Per default il controllo delle asserzioni è disabilitato. 1

Uso appropriato 1. Le asserzioni possono essere utilizzate come precondition nei metodi non pubblici: i metodi pubblici devono fare un controllo esplicito e sollevare un eccezione. 2. Le asserzioni non vanno usate per controllare l input dell utente, i parametri a linea di comando, etc. 3. Le asserzioni possono sempre essere utilizzate come postconditions e loop invariants. Sintassi assert condizione [: messaggio]; Se la condizione è falsa, solleva un errore contenente il valore del messaggio (che è opzionale). In messaggio è possibile specificare una stringa ma anche la chiamata di un metodo che non ritorni void. Questo verrà invocato solo se l asserzione è false La seconda espressione è utilizzata come un messaggio che dettaglia l AssertionError sollevato 2

Semplice esempio (postcondition) public class EsempioAssertion { public void miometodo(int valore) { Object foo = null; // elaboro l oggetto foo // Controllo che l oggetto sia valorizzato (postcondition) assert foo!= null: Impossibile ottenere foo con valore + valore; public static void main(string[] args) { EsempioAssertion miooggetto = new EsempioAssertion(); miooggetto.miometodo(10); Attenzione allo statement assert Lo scopo dello statement assert è quello di fornire un modo per intercettare errori in anticipo Lo statement assert èpresente da Java 1.4 La nuova parola del linguaggio potrebbe generare errori in programmi che utilizzano assert come identificativo di proprietà. C è quindi un modo per scongiurare questo pericolo Infatti sarebbe un vero e proprio errore di sintassi C è la possibilità di turn off la parola chiave assert Quando è turn off, java semplicemente ignora lo statement. Sfortunatamente questo significa che gli assert potrebbero essere spenti quando invece si desidera che facciano il loro lavoro 3

AssertionError AssertionError è un Error, non un Exception Non c è bisogno di metterlo in un try/catch Quindi l uso di assert non necessita di altro lavoro extra da parte del programmatore La seconda espressione non è sempre necessaria Se c è un AssertionError, java automaticamente fornisce uno stacktrace completo di numero di riga Utilizzare il secondo argomento solo se è utile aggiungere ulteriori informazioni al messaggio di errore Asserzioni vs Eccezioni Quando usare asserzioni invece di eccezioni? Entrambi intercettano problemi del programma, ma Il loro scopo è molto diverso! L eccezione dice all utente del programma che qualcosa è andato storto. L asserzione documenta qualcosa relativamente al programma Quando fallisce infatti segnala che c è un bug Si creano eccezioni quando si ha a che fare con problemi che possono insorgere. Si scrivono asserzioni per salvaguardare cose che si conoscono (o si dovrebbero conoscere) relativamente al comportamento del programma 4

Quando usare eccezioni Usa eccezioni quando: Serve verificare se i parametri di metodo/costruttore pubblico sono validi Se sono public infatti altre persone oltre allo sviluppatore possono invocarli In breve, Pensa a te stesso come l autore della classe in oggetto Qualunque cosa che potrebbe andare storto sulla quale l autore non ha controllo all interno della stessa determina un eccezione Quando usare asserzioni Frequentemente! Intendi le asserzioni come cheap to write Inseriscile nel codice ogni volta ne senti il bisogno Esempio: assert eta >= 0; è molto semplice e veloce Non devono essere intese come uno strumento di debug (sebbene possano essere usate anche per questo ) Piuttosto dovrebbero essere usate per specificare cose che devono essere vere in vari punti del codice Forniscono documentazione, non solo controllo sugli errori Sono di fatto documentazione automatica che può essere verificata dal programma stesso! 5

Invariants Internal invariant sono fatti che si crede debbano essere sempre veri ad un certo punto di esecuzione di un programma Control-flow invariant è l assunzione che il programma sarà eseguito in un certo ordine. Ad uno step ne seguirà un altro. Certe righe saranno eseguite ed altre no NB: E un errore inserire codice dove java sa che non potrà mai raggiungere (es. Immediatamente dopo un return) Preconditions, Postconditions fatti che devono essere sempre veri rispettivamente quando un metodo è invocato e quando la sua esecuzione è terminata con successo NB: E un errore utilizzare le assertions come preconditions in metodi pubblici Class invariant è la condizione che un oggetto deve sempre soddisfare per essere un membro valido della classe, eccetto durante la transizione da uno stato ad un altro Esempi (internal invariants) if (x < 0) {... else if (x == 0) {... else { assert x > 0;... switch(suit) { case Suit.CLUBS:... break; case Suit.DIAMONDS:... break; case Suit.HEARTS:... break; case Suit.SPADES:... break; default: assert false: suit; 6

Esempi (control flow invariants) void foo() { for ( ) { if ( ) return; assert false; // non dovrebbe mai finire qui Dove non usare le asserzioni Non usare le asserzioni per fare lavoro necessario Le asserzioni possono essere disabilitate ( turned off ) Non è una buona idea avere un programma che funziona correttamente solo con le asserzioni abilitate ( turned on ) Non usare le asserzioni per controllare gli argomenti di metodi pubblici Il controllo degli argomenti è parte del contratto, deve funzionare anche senza le asserzioni Ci sono le eccezioni per questo: IllegalArgumentException, NullPointerException, e IndexOutOfBoundsException, ecc 7

Asserzioni possono essere illegali (disallowed) Vecchie versioni di Java non le implementano E possibile che nel codice assert sia stato usato per nome di variabile o metodo Dobbiamo consentire l uso di vecchi programmi Quindi potremmo aver bisogno di rimuovere assert come keyword del linguaggio Non ci sono problemi con vecchi compilati (.class) che usano assert come un nome definito dall utente Il problema potrebbe sorgere quando ricompiliamo il vecchio sorgente Nelle JDK 1.4 di default javac non usa però la nuova modalità Nota bene: il compilatore javac ècambiato, non l interprete java Compilazione Sorgenti Per compilare dei sorgenti utilizzando le assertion è necessario utilizzare la sintassi. javac source 1.4 NomeClasse.java Se l opzione source 1.4 viene dimenticata, la parola chiave assert verrà interpretata come un identificatore. 8

Asserzioni On/Off in pratica Per abilitare/disabilitare le asserzioni si utilizza l opzione ea e da Es: java ea NomeClasse java da NomeClasse java -ea:unaclasse NomeClasse java -da:package... NomeClasse java -ea:package... -da:package.subpkg0... NomeClasse Per indicare un package si usano i Assicurarsi che siano abilitate Il seguente codice, posto in testa alla vostra classe, controlla se sono abilitate public static boolean isassertionenabled() { boolean assertionenabled = false; assert (assertionenabled == true); return assertionenabled; 9