Hello World
Riga 1:
class HelloWorld
Dichiarazione della classe HelloWorld. Come vedremo ogniprogramma Java utilizza il concetto fondamentale di classe,che sarà trattato in dettaglio nel prossimo capitolo.Tutti i listati Java fanno uso di classi: l’interocodice, a parte le importazioni di librerie e ledichiarazioni d’appartenenza ad un package, èsempre incapsulato all’interno di classi.
Questo programma deve essere salvato esattamente col nomedella classe, prestando attenzione anche alle letteremaiuscole o minuscole. Questa condizione è necessariaper mandare in esecuzione il nostro programma.
Riga 2:
{
Questa parentesi graffa aperta (ottenuta tenendo premuto iltasto ALT e scrivendo 123 con i tasti numerici che si trovanosulla destra della vostra tastiera, e poi rilasciandol’ALT) indica l’inizio della classe HelloWorld,che si chiuderà alla riga 7 con una parentesi graffachiusa. Il blocco di codice compreso da queste due parentesidefinisce la classe HelloWorld.
Riga 3:
public static void main(String args[])
Questa riga è bene memorizzarla da subito, dato cheessa deve essere definita in ogni applicazione Java. Trattasidella dichiarazione del metodo main. In Java, metodo èsinonimo di azione (i metodi saranno trattati in dettagliopiù avanti) ed il metodo main definisce il punto dipartenza dell’esecuzione di ogni programma. La primaistruzione che verrà quindi eseguita in fase diesecuzione, sarà quella che la J.V.M. troveràsubito dopo l’apertura del blocco di codice chedefinisce questo metodo.
Ma oltre al nome "main" , la riga 3 contiene altreparole di cui studieremo in dettaglio il significato neiprossimi capitoli:
public Modificatore del metodo. I modificatorisono utilizzati in Java come nel linguaggio umano sonoutilizzati gli aggettivi. Se si antepone un modificatore alladichiarazione di un
elemento Java (un metodo, una variabile, una classe etc.)questo cambierà in qualche modo (a seconda delsignificato del modificatore) la sua funzionalità. Inquesto caso
trattasi di uno specificatore d’accesso che rende difatto il metodo accessibile anche al di fuori della classe incui è stato definito.
static Altro modificatore del metodo.La definizione di static è abbastanza complessa. Perora accontentiamoci di sapere che è essenziale per ladefinizione del metodo main.
void E’ il tipo di ritorno delmetodo. Significa "vuoto" e quindi questo metodonon restituire nessun tipo di valore. Il main non deve maiavere un tipo di ritorno diverso da void.
main Come abbiamo già detto,trattasi del nome del metodo (detto anche identificatore delmetodo).
(String args[]) Alla destra dell’identificatore di unmetodo, si definisce sempre una coppia di parentesi tonde cheracchiude una lista di parametri (detti anche argomenti)
opzionalmente. Il metodo main, in ogni caso, vuole semprecome parametro un array di stringhe (agli array troveremodedicato nel terzo modulo, un’intera unità
didattica). Notare che args è l’identificatore(nome) dell’array, e quindi è l’unicaparola che può variare nella definizione del metodomain, anche seper
convenzione si utilizza sempre args.
Riga 4:
{
Questa parentesi graffa indica l’inizio del metodomain, che si chiuderà alla riga 6 con una parentesigraffa chiusa. Il blocco di codice compreso da queste dueparentesi definisce il metodo.
Riga 5:
System.out.println("Hello World!");
Questo comando, che come già detto verràeseguito non appena avremo mandato in esecuzione ilprogramma, stamperà a video la stringa "HelloWorld!". Anche in questo caso, giacché dovremmointrodurre argomenti per i quali il lettore non èancora maturo, preferiamo rimandare la spiegazionedettagliata di questo comando ai prossimi capitoli. Per oraci basterà sapere che stiamo chiamando un metodoappartenente alla libreria standard di Java che si chiamaprintln, passandogli come parametro la stringa chedovrà essere stampata.
Riga 6:
}
Questa parentesi graffa chiusa (ottenuta tenendo premuto iltasto ALT e scrivendo 125 con i tasti numerici che si trovanosulla destra della vostra tastiera, e poi rilasciandol’ALT) chiude l’ultima che è stata aperta,ovvero chiude il blocco di codice che definisce il metodomain.
Riga 7:
}
Questa parentesi graffa invece chiude il blocco di codice chedefinisce la classe HelloWorld.
Unità didattica 1.5)
- Compilazione ed esecuzione del programma HelloWorld
Una volta riscritto il listato appena presentato sfruttandoun Text Editor (supponiamo il Note Pad di Windows), dobbiamosalvare il nostro file in una cartella di lavoro, chiamata adesempio "CorsoJava". Se si decide di utilizzare ilNote Pad, il lettore presti attenzione al momento delsalvataggio, ad includere il nome del file (che ricordiamodeve essere obbligatoriamente HelloWorld.java) tra virgolettein questo modo "HelloWorld.java". Tutto ciòsi rende necessario, essendo Note Pad un editor di testogenerico, e non un editor per Java, e quindi tende a salvarei file con il suffisso".txt".
A questo punto possiamo iniziare ad aprire una prompt di Dosed a spostarci all’interno della nostra cartella dilavoro. Dopo essersi accertati che esista il file"HelloWorld.java" possiamo passare alla fase dicompilazione. Se lanciamo il comando:
javacHelloWorld.java
mandiamo il nostro file sorgente in input al compilatore checi mette a disposizione il J.D.K.. Se al termine dellacompilazione non ci viene fornito nessun messaggio di errore,vuol dire che la compilazione ha avuto successo. A questopunto possiamo notare che nella nostra cartella di lavoroè stata creato un file di nome"HelloWorld.class". Questo è appunto il filesorgente tradotto in byte code, pronto per essereinterpretato dalla J.V.M.: Se lanciamo il comando:
java HelloWorld
il nostro programma, se non sono lanciate eccezioni dallaJ.V.M., dopo qualche attimo d’attesa relativoall’interpretazione del byte code compilato,verrà mandato in esecuzione stampando il tantosospirato messaggio.
Unità didattica 1.6)
- Possibili problemi in fase di compilazione edesecuzione
Di solito, nei primi tempi, gli aspiranti programmatori Javaricevono spesso dei messaggi misteriosi da parte delcompilatore e dell’interprete Java.
Possibili messaggi di errore in fase di compilazione:
1)javac: Command not found
In questo caso non è il compilatore che ci stasegnalando un problema bensì, è lo stessosistema operativo che non riconosce il comando"javac" che dovrebbe chiamare il compilatore delJ.D.K.. Probabilmente quest’ultimo non è statoinstallato correttamente. Un tipico problema è di nonaver settato la variabile d’ambiente path (consultarele note d’installazione).
2) HelloWorld. java: 6: Method printl( java.lang.String) notfound in class java.io.PrintStream.
System.out.printl (" Hello World!");
^
(J.D.K. fino alla versione 1.2)
oppure
HelloWorld.java:6: cannot resolve symbol
symbol : method printl (java.lang.String)
location: class java.io.PrintStream
System.out.printl(" Hello World!");
^
(J.D.K. versione 1.3)
Se riceviamo questo messaggio, abbiamo semplicemente scritto"printl" in luogo di "println". Ilcompilatore non può da solo accorgersi che èstato semplicemente un errore di battitura, ed allora ci hasegnalato che il metodo printl non è stato trovato. Infase di debug, è sempre bene prendere coscienza deimessaggi di errore che ci fornisce il compilatore, tenendoben presente però, che ci sono dei limiti a questimessaggi ed alla comprensione degli errori del compilatorestesso.
3) HelloWorld.java:6: ';' expected
System.out.println(" Hello World!")
^
(qualsiasi versione del J.D.K.)
In questo caso il compilatore ha capito subito che abbiamodimenticato un punto e virgola, immancabile conclusione diogni statement (istruzione). Purtroppo, anche se stiamoparlando di una dei migliori compilatori in circolazione, nonsarà sempre così preciso. In alcuni casi, sedimentichiamo un punto e virgola (oppure dimentichiamo dichiudere un blocco di codice con una parentesi graffa), ilcompilatore ci segnalerà l’esistenza di erroriinesistenti in successive righe di codice.
2) HelloWorld.java:1: 'class' or 'interface'expected
Class Argomenti
^
(qualsiasi versione del J.D.K.)
In questo caso invece avremo scritto class con letteramaiuscola e quindi la J.V.M. ha richiesto esplicitamente unadichiarazione di classe (o di interfaccia, concetto chechiariremo più avanti). "Class" loripetiamo, non è la stessa cosa di "class"in Java.
Possibili messaggi relativi alla fase di interpretazione:
1) Exception in thread "main"java.lang.NoSuchMethodError: main
Se questo è il messaggio di risposta ad un tentativodi mandare in esecuzione un programma, forse abbiamo definitomale il metodo main. Probabilmente abbiamo dimenticato didichiararlo static o public, oppure abbiamo scritto male lalista degli argomenti (che deve essere String args[]), omagari non abbiamo chiamato "main" il metodo.
Altri classici motivi che potrebbero provocare questomessaggio, possono essere il dichiarare il nome del file conun nome diverso da quello della classe, o il dichiarare ilmetodo main in modo non corretto.
2) Exception in thread "main"java.lang.NoClassDefFoundError: Helloworld (wrong name
: HelloWorld)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:11
1)
atjava.net.URLClassLoader.defineClass(URLClassLoader.java:248)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
Non c’è da spaventarsi! Questo èsemplicemente il caso in cui la J.V.M. non trova la classeJava contenente il byte code da interpretare. Infatti, comesi può notare, è stato lanciato il comando"java Helloworld" invece di "javaHelloWorld". Non sempre quindi messaggi lunghirichiedono radicali correzioni!
- Articolo precedente Primo approccio al codice
- Articolo successivo Componenti fondamentali di un programma