Fondamenti di Informatica Prof. Alfredo Cuzzocrea University of Trieste Introduzione a Java/2 Credits to: Dr. L. Rigutini - UniSI Regole di base di JAVA Regole di base – 1 ¾ Java, come quasi tutti i linguaggi di programmazione di alto livello è case-sensitive, distingue cioè le lettere minuscole da quelle maiuscole: ¾ ¾ È consigliato inserire delle linee di commento per rendere il codice più leggibile e comprensibile (commentare il codice): ¾ ¾ ¾ La variabile nome è quindi diversa da Nome La sequenza // permette di commentare la parte di riga rimanente I delimitatori /* e */ permettono di commentare tutto ciò compreso tra queste due sequenze di caratteri Es: int a=3; // questa parte finale della riga è commentata /* commento su più righe */ Regole di base – 2 ¾ Istruzione ¾ ¾ Blocchi di codice ¾ ¾ Ogni istruzione deve essere terminata da un ‘;’ Ogni blocco di codice (sequenza di una o più istruzioni da eseguire in blocco) è racchiuso tra parentesi graffe: ‘{ }’ Formattazione ¾ ¾ Una singola istruzione per riga L’apertura di un blocco viene indentata per rendere più chiara la struttura del blocco class HelloWorld { public static main(String[] args) { // visualizza un messaggio di saluto System.out.println(“Hello World !!”); } } Facciamo un esempio ¾ Scrivere un applicazione di benvenuto: ¾ ¾ ¾ il cosiddetto HelloWorld Iniziamo col creare un file HelloWorld.java con il notepad (o qualsiasi altro editor di testo) Scriviamo il codice per la nostra applicazione: class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } ¾ Settiamo le variabili di ambiente JAVAHOME e PATH in modo cha sia possibile utilizzare javac.exe e java.exe Facciamo un esempio ¾ Copiamo lo script nella directory dove abbiamo salvato il file HelloWorld.java ed avviamo la shell ¾ Digitiamo: javac HelloWorld.java E vediamo che viene creato il file HelloWorld.class ¾ Se proviamo ad aprire il file HelloWorld.class con un editor di testo (notepad), vediamo una sequenza di caratteri incomprensibile: ¾ ¾ bytecode della nostra prima applicazione Java Adesso chiamiamo la JVM per eseguire la nostra classe: java HelloWorld Facciamo un esempio ¾ Otteniamo però un errore: Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld Cosa vuol dire? La JVM non trova la classe HelloWorld di cui deve lanciare la funzione main() ¾ Forse vuole il nome del file: java HelloWorld.class ¾ Otteniamo ancora un errore simile: Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld/class La JVM ancora non trova la classe HelloWorld/class (spiegheremo in seguito la differenza tra questi due errori) ¾ Dove è il problema? Facciamo un esempio ¾ Il problema sta nel fatto che la JVM cerca la classe HelloWorld (ossia il file HelloWorld.class) nei percorsi specificati dalla variabile di sistema CLASSPATH: ¾ ¾ Questa variabile non contiene però il percorso dove realmente si trova HelloWorld.class E’ necessario quindi specificare alla JVM che cerchi il file (o meglio la classe) anche nella directory corrente: java –cp . HelloWorld ¾ Adesso funziona tutto !! Facciamo un esempio ¾ Proviamo adesso a rinominare la funzione main(String[] args) con run(String[] args) e compiliamo di nuovo: ¾ ¾ Per adesso nessun problema, javac genera il file HelloWorld.class Proviamo a lanciare HelloWorld.class : java –cp . HelloWorld ¾ Ovviamente otteniamo un errore: ¾ ¾ Exception in thread "main" java.lang.NoSuchMethodError: main Perché OVVIAMENTE ? Che errore si verifica ? Facciamo un esempio ¾ Leggendo attentamente il messaggio di errore si vede che la JVM ci sta dicendo che non trova il metodo main ¾ ¾ Il metodo main di un oggetto, come detto, contiene il corpo principale dell’applicazione rappresentata dall’oggetto stesso Quando si invia un oggetto alla JVM, quest’ultima prova a lanciare il metodo main, ad eseguire quindi l’oggetto come se fosse un applicazione: ¾ Se tale metodo non esiste, la JVM ritorna un errore del tipo visto prima Esempio ¾ Esempio: 01.HelloWorld\01.HelloWorld IDE e JBuilder Integrated Development Environment (IDE) ¾ Un IDE è una applicazione grafica che fornisce al programmatore un ambiente di sviluppo completo ma al tempo stesso semplice e chiaro ¾ Tramite una interfaccia grafica (GUI) è possibile costruire il progetto, tenere sotto controllo le varie parti, effettuare il debugging e molto altro ancora ¾ I più comuni ambienti di sviluppo Java sono: ¾ ¾ ¾ JBuilder – della Borland, a pagamento, ma è disponibile una versione free (chiamata Foundation) NetBeans – della SunMicrosystem, free scaricabile dal sito www.java. Eclipse – della Eclipse Foundation Integrated Development Environment (IDE) ¾ L’uso dei programmi da linea di comando javac e java viene nascosto dalla IDE: ¾ ¾ ¾ Compilando il progetto, il software passa al compilatore tutti i files necessari e genera i file .class Anche l’esecuzione del programma è gestita dall’interfaccia e richiede solamente di specificare quale funzione main() mandare in esecuzione Anche la gestione del path e del classpath è automatizzata e resa “friendly” dall’interfaccia grafica: ¾ ¾ ¾ Il path corrente è automaticamente inserito nel classpath Aggiungendo librerie automaticamente viene aggiunto il percorso al classpath Ecc… JBuilder ¾ L’ambiente che utilizzeremo in questo laboratorio è il JBuilder, ma tutto ciò che viene fatto è facilmente trasportabile su NetBeans o su Eclipse ¾ Oltre alla libreria standard del Java, ogni IDE può mettere a disposizione librerie proprietarie da utilizzare nel progetto: ¾ ¾ Non sempre consigliato dato che una caratteristica molto importante del Java è quella della trasferibilità del codice e molte volte l’uso di librerie proprietarie può limitare questa possibilità Il JBuilder mette a disposizione una gran quantità di tipologie di progetto: ¾ tramite un wizard è possibile scegliere il tipo di progetto, specificarne i parametri ed iniziare a programmare Esempio ¾ Proviamo adesso a creare una applicazione HelloWorld utilizzando il JBuilder ¾ Prima di tutto avviamo il JBuilder ¾ Andiamo su File e selezioniamo new ¾ ¾ ¾ Possiamo creare direttamente una classe o un progetto. Nel primo caso, viene richiesto comunque di creare un progetto per la classe. Una volta scelto il nome del progetto e dove salvarlo passiamo alla creazione guidata della classe Ci viene chiesto il nome della classe (HelloWorld) ed il package: ¾ ¾ Per adesso ignoriamo il package (lasciamo bianco il campo del package) Notiamo l’opzione “generate main method” che permette di generare uno “scheletro” per la funzione main all’interno della classe Esempio ¾ Inseriamo il codice Java nel file HelloWorld.java class HelloWorld { public static void main(String[] args) { System.out.println(“Hello World!”); } } ¾ Adesso possiamo compilare ed eseguire l’applicazione: ¾ ¾ Tramite il menù run lanciamo l’applicazione Notiamo la possibilità di lanciare l’applicazione anche sotto debug Esempio ¾ Nella finestra in basso vedremo visualizzato l’output dell’applicazione ¾ E’ possibile verificare che anche in questo caso, rinominando la funzione main() in qualsiasi altro modo (anche Main()) il JBuilder ritorna errore Esempio ¾ Esempio: 01.HelloWorld\02.HelloWorld-JBuilder Debug Debug in JBuilder ¾ Un IDE permette di effettuare un’operazione molto utile al programmatore: ¾ ¾ Trovare i punti in cui il programma si comporta in maniera differente da quello che il creatore si aspettava è un lavoro molto difficile e costoso: ¾ ¾ Il debugging Il debug a run-time permette di fissare dei break-point Break-point: punto del programma in cui si desidera fermare il flusso delle istruzioni per verificare ed ispezionare lo stato dell’applicazione Breakpoint ¾ Viene selezionata la riga di codice in cui si desidera interrompere il programma ¾ Quando l’esecuzione del programma raggiunge tale riga di codice, l’IDE interrompe l’esecuzione e permette all’utente di interagire con il programma: ¾ per esempio la lettura di alcuni valori attuali dell’applicazione ¾ Una volta terminata la verifica è possibile “continuare” fino al break-point successivo o fino alla terminazione dell’applicazione ¾ Inoltre esiste la modalità passo-passo in cui l’ambiente si ferma ad ogni istruzione Esempio ¾ Riprendiamo l’applicazione HelloWorld ¾ ¾ ¾ ¾ Inseriamo una istruzione per aumentare il numero di istruzioni: ES : una istruzione di assegnamento ad una variabile int a = 4; Mettiamo un break-point nella istruzione successiva a questa Lanciamo l’applicazione in modalità debug Esempio ¾ Vediamo che l’esecuzione si interrompe alla linea di codice con il break-point ¾ A questo punto è possibile: ¾ ispezionare i contenuti dell’oggetto Esempio ¾ mettere dei watch sulle variabili Esempio ¾ Infine è possibile “continuare” l’applicazione (F9) fino ad un successivo break-point o alla fine, andare avanti passo-passo (F8), entrare all’interno della funzione corrente(F7), ecc… Modo 1 Modo 2 Esempio ¾ Esempio: 01.HelloWorld\02.HelloWorld-JBuilder Il JavaDoc Il JavaDoc ¾ L’ambiente di sviluppo grafico permette di creare la documentazione in automatico: ¾ la Sun aveva previsto la possibilità di descrivere, mediante apposita sintassi, le varie funzioni disponibili in ogni oggetto ¾ Per creare una descrizione di una funzione è sufficiente inserire prima del metodo e fuori da ogni altra funzione la descrizione della funzione delimitata dalle sequenze /** e */ ¾ Aggiungendo il tool JavaDoc al progetto, è possibile creare la documentazione della classi e delle funzioni del progetto: JavaDoc ¾ Descrizione di una classe: ¾ ¾ Quando inseriamo la sequenza /** il JBuilder automaticamente inserisce i campi descrittivi della classe in cui l’autore può inserire la descrizione: ¾ titolo, descrizione, autore, versione, ecc… Descrizione di una funzione ¾ ¾ Quando inseriamo la sequenza /** il JBuilder crea automaticamente le righe per la descrizione dei parametri di ingresso e di ritorno della funzione: ¾ Es: @param args String[] Î indica che la funzione ha un parametro di ingresso args di tipo String[] L’autore della funzione può inserire la descrizione della funzione nella prima riga del blocco generato automaticamente da JBuilder JavaDoc – Esempio ¾ Creare una classe HelloWorld de-selezionando tutti i check-box durante il wizard di JBuilder: ¾ Verrà creata una classe semplice prova senza alcuna funzione o variabile class HelloWorld { } ¾ Creiamo il JavaDoc per la classe: /** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ class HelloWorld { } JavaDoc – Esempio ¾ Creare una funzione nella classe HelloWorld (creiamo la funzione main() che per ora è l’unica cha abbiamo visto come si scrive): class HelloWorld { public static void main(String[] args) { } } ¾ Creiamo il JavaDoc per questa funzione: class HelloWorld { /** * * @param args String[] */ public static void main(String[] args) { } } JavaDoc – Esempio ¾ Inseriamo il titolo e la descrizione della classe e la descrizione della funzione /** * <p>Title: Hello World</p> * <p>Description: Classe di prova per il JavaDoc</p> * <p>Copyright: Copyright (c) 2005</p> * <p>Company: </p> * @author not attributable * @version 1.0 */ class HelloWorld { /** * Funzione principale per il test * @param args String[] */ public static void main(String[] args) { } } JavaDoc – Esempio ¾ Compiliamo, solo il JavaDoc o tutto quanto ed apriamo il file index.html del JavaDoc: JavaDoc – Esempio ¾ La funzione è visualizzata in due punti: ¾ nel sommario delle funzioni in cui viene mostrata una lista di tutte le funzioni con un breve descrizione (la prima riga del commento inserito) ¾ nella sezione dettagli, in cui viene visualizzata tutta la descrizione Esempio ¾ Esempio: 01.HelloWorld\02.HelloWorld-JBuilder