Questa è una vecchia versione del documento!
Indice
FAQ (Frequently Asked Questions)
Domande su esercitazioni in laboratorio
Come si settano i parametri d'avvio di Java su Eclipse (i "command line arguments")?
Supponendo di avere una classe:
public class Less { public static void main(String[] args) { ... } }
compilata da shell con il comando:
->javac Less.java
e avviata da shell con:
->java Less pippo.txt /usr/share/dict/words
allora args.length
sarà uguale a 2, mentre in args[0]
sarà contenuta la
stringa “pippo.txt”
e in args[1]
la stringa “/usr/share/dict/words”
.
Per settare i parametri d'avvio di Java su Eclipse, cliccare in
successione dal menù:
run open run dialog arguments
e inserire gli argomenti separati da spazio (nell'esempio precedente,
pippo.txt
/usr/share/dict/words
)
Come fare per avviare Eclipse se all'avvio segnala "workspace in uso"?
A causa di una chiusura errata di Eclipse (ad es., tramite il comando
“kill”
) può succedere che all'avvio mostri questo messaggio. Per
sbloccarlo è necessario rimuovere il file .lock
che si trova nella
directory .metadata
del workspace. Ad es.:
-> rm [PATH]/workspace/.metadata/.lock
Dove stanno i file .java e .class in un progetto creato con Eclipse e come si avvia da shell un programma creato tramite Eclipse?
Al momento della creazione di un project in Eclipse, nella seconda schermata appare un'opzione “project layout”:
* use project folder as root for sources and class files * create separate folders for sources and class files
che di default (modificabile) è settata sulla seconda scelta. In
quest'ultimo caso, Eclipse crea due sottodirectory del progetto,
chiamate “src”
e “bin”
. La prima contiene i sorgenti, cioè i file .java
,
la seconda gli “eseguibili” (in realtà, file bytecode con estensione
.class
). Se si usano dei package, vengono create anche sottodirectory
per ogni package sia sotto “bin”
che sotto “src”
. Se, invece, si usa
un'unica root directory, sia i file .java
che .class
sono nella
directory del progetto.
Supponiamo di aver creato in Eclipse il progetto “projectname”
che ha un
unico file “Foo.java”
. Nel caso in cui si avvii il programma da Eclipse,
la current directory è in tutti i casi [PATH]/workspace/projectname/
.
Nel caso in cui si avvi da shell (supponiamo, per semplicità, di non
usare il parametro 'classpath
'), allora ci sono vari casi per avviare il
programma:
se si è scelto di usare directory separate per bin e src: e si definisce il package "foo": current directory = [PATH]/workspace/projectname/bin comando = java foo.Foo altrimenti: current directory = [PATH]/workspace/projectname/bin comando = java Foo con un'unica root directory per sorgenti e file .class: e si definisce il package "foo": current directory = [PATH]/workspace/projectname/ comando = java foo.Foo altrimenti: current directory = [PATH]/workspace/projectname/ comando = java Foo
In tutti i casi (sia da Eclipse che da shell), se si vuole aprire un
file usando un path relativo, ad es. tramite il comando 'FileInputStream
in = new FileInputStream(“pippo.txt”);
', bisogna che il file “pippo.txt”
stia nella current directory. Per ottenere il nome della current
directory da Java, si può usare il comando:
System.getProperty(“user.dir”);
Quali sono le convenzioni per i nomi in Java?
- classi: prima lettera maiuscola
class Raster; class ImageSprite;
- interfacce: prima lettere maiuscola
interface RasterDelegate; interface Storing;
- metodi: prima lettera minuscola
run(); runFast(); getBackground();
- variabili: prima lettera minuscola
int i; char c; float myWidth;
Per i nomi di classi, interfacce, metodi e variabili si usa la notazione “a gobba di cammello”: ciascuna lettera iniziale di ogni parola interna al nome deve essere maiuscola.
- costanti: tutte maiuscole, con parole interne separate dal simbolo underscore “_”
static final int MIN_WIDTH = 4; static final int MAX_WIDTH = 999; static final int GET_THE_CPU = 1;
- package: nomi minuscoli
com.sun.eng com.apple.quicktime.v2 edu.cmu.cs.bovik.cheese
Vedere anche: http://java.sun.com/docs/codeconv/
Come convertire i parametri del main (stringhe) in interi/double?
Supponiamo che il programma si aspetti due parametri, un intero e un double. In questo caso, si può fare così:
int myInt = Integer.parseInt(args[0]); double myDouble = Double.parseDouble(args[1]);
Può convenire mettere queste istruzioni all'interno di un try/catch
, per
catturare eventuali eccezioni che sono dovute, ad esempio, a mancanza di
input (ArrayIndexOutOfBoundsException
) o errore di conversione
(NumberFormatException
), in maniera tale da settare comunque valori di
default per le variabili myInt
e myDouble
, oppure per ritornare un
messaggio di errore all'utente.
Come generare dei numeri random in Java?
Si può usare la classe java.util.Random
in questa maniera:
int MAX_VALUE = 100; Random randomGenerator = new Random(); // oppure: new Random(System.currentTimeMillis()); int randomInt = randomGenerator.nextInt(MAX_VALUE);
Attenzione: il metodo nextInt(int n)
ritorna un numero compreso tra 0 e
n-1
(nell'esempio, tra 0 e 99), per cui se si vogliono generare dei
numeri compresi tra 1 e n
, si deve sommare 1 al valore ritornato.
In alternativa si può usare il metodo statico Math.random()
, che ritorna
un double
in [0, 1), in questa maniera:
int randomInt = (int) (Math.random() * MAX_VALUE);
(anche in questo caso, randomInt
sarà compreso tra 0 e 99)
Attenzione: il seguente modo per generare un numero random è sbagliato:
int randomInt = (int) Math.random() * MAX_VALUE; //sbagliato!!!
Infatti, dato che l'operatore di cast ha precedenza rispetto a
l'operatore di moltiplicazione, il numero ritornato da Math.Random()
viene convertito a 0 e quindi il risultato della moltiplicazione è 0.