Corso di Reti di Calcolatori Programmazione Java 1. Introduzione a Java 29/11/2002 ing. G. Lo Presti
Cenni storici Cos’è Java? Presentato da Sun nel 1995 “A simple, object-oriented, network-savvy, interpreted, robust, secure, architecture-neutral, portable, high-performance, multithreaded, dynamic language.” Presentato da Sun nel 1995 Obiettivo principale: portabilità Versione attualmente disponibile: J2SE 1.4.1 (Ott. 2002) Continuamente sviluppato da Sun e da una grande comunità di sviluppatori Link di riferimento: http://java.sun.com/ Tutorial: http://java.sun.com/docs/books/tutorial/ API molto evoluta e ricca di funzionalità per ogni tipo di applicazione, ed in particolare per le applicazioni di rete. ing. G. Lo Presti
Strumenti e ambienti di sviluppo Strumenti del JDK ufficiale javac per compilare i sorgenti java per eseguire il bytecode appletviewer per eseguire le applet javadoc per generare la documentazione HTML Ambiente di sviluppo consigliato Borland JBuilder 7 Personal edition scaricabile gratuitamente da http://www.borland.com/products/downloads/ ing. G. Lo Presti
Java execution model Compilation of the Source Code to Byte-code Java source code Compilation of the Source Code to Byte-code Java Compiler Java byte-code Byte-code interpreter Byte-code compiler Java chip Java Machine (eg. mobile phone, etc.) CPU Native machine code Java Virtual Machine Execution of Byte-code CPU Java Virtual Machine ing. G. Lo Presti
Alcune regole di base Java è fortemente orientato agli oggetti Uso estensivo di classi e di package Il compilatore è case sensitive come in C/C++ Convenzioni: Nomi dei package tutti in minuscole Nomi delle classi e dei file sorgenti con l’iniziale maiuscola Nomi dei metodi e delle variabili con l’iniziale minuscola Nomi delle costanti tutti in MAIUSCOLE ing. G. Lo Presti
Il primo programma Java Un esempio di programma Java: Qualunque programma Java deve contenere una classe che includa il metodo main(). Tale metodo viene eseguito dalla JVM all’avvio del programma stesso. // Filename: HelloWorld.java /** A Java program that prints the message “Hello World” */ public class HelloWorld { public static void main(String[] args) { System.out.println(”Hello World”); /* System.out refers to standard output */ } ing. G. Lo Presti
Il primo programma Java Per compilare ed eseguire un programma javac HelloWorld.java java HelloWorld E’ possibile generare la documentazione di riferimento in formato HTML javadoc HelloWorld Nota: la documentazione prodotta con questo strumento è analoga a quella delle API Java ufficiali, consultabile all’indirizzo: http://java.sun.com/j2se/1.4.1/docs/api/ Maggiori dettagli più avanti… ing. G. Lo Presti
Il linguaggio: tipi predefiniti (richiami) Tipi primitivi byte, int, short, long, float, double char (Unicode, 2 byte) boolean NON c’è il pointer Tipi non primitivi: sono gestiti internamente come puntatori array (es. int[], String[]) String (diverso da char[] !) qualunque classe definita dal sistema o creata dall’utente (ereditano tutte da Object) ing. G. Lo Presti
Il linguaggio: costrutti (richiami) if – else while / do – while switch for try – catch – finally throws Per gestire le eccezioni Dettagli più avanti Sintassi sostanzialmente identica al C/C++ I costrutti if e while richiedono un’espressione di tipo boolean e non intera come in C/C++ Il costrutto switch richiede un’espressione di tipo int Java è fortemente tipizzato! ing. G. Lo Presti
Operatori ed espressioni Esistono quasi tutti gli operatori C, più alcuni nuovi Operatori mancanti: * e & perché i puntatori non sono visibili esplicitamente sizeof() Operatori nuovi: + per la concatenazione di stringhe L’accesso ai tipi non primitivi avviene sempre implicitamente per riferimento, quindi non è necessario gestire i puntatori. ing. G. Lo Presti
Variabili e loro scope Le variabili si dichiarano come in C Scope esempi: int i = 1; // tipo primitivo HelloWorld hello = new HelloWorld(); // tipo non primitivo // hello è un oggetto della classe HelloWorld String s = “test”; // equivalente alle versione più formale: String s = new String(“test”); // String è una classe! Scope Variabili di classe: visibili in tutta la classe Variabili locali: definite e visibili all’interno di un blocco di codice { … } Parametri dei metodi: visibili in tutto il corpo del metodo ing. G. Lo Presti
Array e tipi complessi Uso degli array: int[] a; // dichiarazione di un array a = new int[10]; // allocazione di memoria a[0] = 123; // adesso si può usare Un array è sempre un oggetto anche se il tipo degli elementi contenuti è primitivo Contiene quindi alcuni dati, ad esempio: a.length // lunghezza effettivamente allocata per a Va inizializzato allocando lo spazio di memoria come ogni variabile di tipo composto. Dopo l’allocazione, l’array viene riempito con valori nulli (0 per gli int, null per gli oggetti) ing. G. Lo Presti
Eccezioni Eccezione: “An event during program execution that prevents the program from continuing normally; generally, an error” [Tutorial]. E’ un modo per rendere più pulito il codice. Java mette a disposizione dei meccanismi per la gestione delle eccezioni 1) Segnalare (sollevare) un’eccezione quando si verifica un problema; 2) Gestire un eccezione sollevata da un punto di un programma; Sostanzialmente si tratta di un break incondizionato che interrompe l’esecuzione e ritorna al primo chiamante in grado di gestire il problema. ing. G. Lo Presti
Eccezioni Le eccezioni sono implementate come oggetti, istanze della classe Throwable; questa ha due sottoclassi: Error: si tratta di errori gravi come il crash della JVM. Exception: la maggior parte degli errori rientra in questa categoria ed è gestibile. Le API di Java includono diverse eccezioni corrispondenti a molti casi comuni (es.: FileNotFoundException, IOException, ArrayIndexOutOfBoundsException, ecc.). Noi useremo molto questo tipo di eccezioni. Questi oggetti vengono istanziati automaticamente dalla JVM e includono informazioni sull’errore verificatosi. Molto utili in fase di debug! ing. G. Lo Presti
Sollevare un’eccezione Si usa la clausola throw E’ obbligatorio specificare, nella dichiarazione del metodo, che può essere sollevata un’eccezione. Il compilatore impedisce la compilazione di programmi che non gestiscano le eccezioni sollevabili. Esempio: public double factorial(int x) throws ArithmeticException { if(x < 0) throw new ArithmeticException(“x must be >= 0”); … // normalmente calcola il fattoriale } ing. G. Lo Presti
Gestire un’eccezione Si usa il costrutto try – catch Stile: preoccuparsi prima del comportamento generale; gestire le eccezioni successivamente; gestire i diversi tipi di eccezione con catch successivi; passare al chiamante con throw le eccezioni non gestibili. public float getAverage(int[] data) { float avg = 0.0; try { for(int i = 0; i < data.length; i++) avg += data[i]; avg = avg / data.length; // !! return avg; } catch (ArithmeticException ae) { return 0.0; catch (NullPointerException e) { throw new Exception( “data is null! ”+ e.getMessage()); finally { // codice che viene eseguito // in ogni caso ing. G. Lo Presti
Gestire un’eccezione Se sono presenti più sezioni catch successive, vanno gestite prima le eccezioni di tipo più specifico (es. ArithmeticException) e poi quelle più generali (es. Exception, radice di tutte le possibili eccezioni); E’ buona norma gestire le eccezioni nel punto in cui si verificano e demandare il chiamante solo in casi gravi; Molti metodi predefiniti nelle API sollevano molti tipi di eccezioni! Proprietà della classe Exception In fase di creazione di un programma complesso, è opportuno gestire tutti i tipi di eccezioni con costrutti del tipo: try { … } catch(Exception e) { … } ing. G. Lo Presti
Riepilogo Java, JDK e ambienti di sviluppo Sintassi del linguaggio Java Tipi Costrutti Variabili Gestione delle eccezioni Costrutti e tecniche ing. G. Lo Presti