Riprendiamo lesempio iniziato nella scorsa lezione, facendo
alcune importanti considerazioni.
Utilizzare un metodo che stampa dei messaggi a video non è una soluzione
consigliabile, né da utilizzare spesso, perché poco generale e flessibile.
Ad es., se volessimo riutilizzare il metodo controllaCarattere(char)
in unapplicazione a finestre, sarebbe inopportuno avere dei
messaggi stampati nella finestra Dos o in un terminale virtuale
di X in Linux, perché vorremmo avere un maggior controllo sui risultati
dei metodi invocati.
Anche se evitare di stampare messaggi a video ci consente di riutilizzare
i metodi, nondimeno ci possono essere casi in cui non si può fare
a meno di utilizzare una soluzione di questo tipo: in questi casi
è opportuno dichiarare tali metodi con nomi del tipo printQualcosa(),
dove Qualcosa deve essere una stringa che chiarisca il contenuto
dei messaggi stampati.
Per evitare di stampare messaggi a video si può fare in modo che
il metodo restituisca al chiamante una stringa, in modo che questultimo
possa utilizzarla come meglio crede, ad es. per scriverla in un
campo di testo allinterno di una finestra.
Ciò premesso, esaminiamo il metodo main della classe TestCondizionali:
public static void main(String[ ] args) {
String s = null;
System.out.print("Immettere stringa da esaminare: ");
try {
BufferedReader linea = new BufferedReader(
new InputStreamReader(System.in));
s = linea.readLine();
} catch (IOException e) {
System.err.print("Errore: ");
e.printStackTrace();
}
if (s == null || s.length() == 0) {
System.err.println("La stringa è vuota: impossibile proseguire!");
System.exit(1);
}
System.out.println("-- Controllo del primo carattere della
stringa");
controllaCarattere(s.charAt(0));
System.out.println("-- Controllo dell'ultimo carattere della
stringa");
controllaCarattere(s.charAt(s.length()-1));
System.out.print("Immettere stringa da ricercare: ");
String c = null;
try {
BufferedReader linea = new BufferedReader(
new InputStreamReader(System.in));
c = linea.readLine();
linea.close();
} catch (IOException e) {
System.err.print("Errore: ");
e.printStackTrace();
}
System.out.println(c);
int conta = 0;
for (int i = 0; i <= s.length() - c.length(); i++) {
if (s.substring(i, i+c.length()).equals(c))
conta++;
}
System.out.println("La stringa \"" + s + "\"
contiene "
+ c + " " + conta + " volte.");
System.exit(0);
}
Esso contiene diverse cose nuove.
Per vedere come funziona questa applicazione, create la classe TestCondizionali,
aggiungetevi i due metodi visti in queste due lezioni, compilate
ed eseguite!
Fatto?
Adesso, vediamo come il metodo main realizza il funzionamento
dellapplicazione.
La cosa più interessante è il modo in cui viene letta la stringa
dalla riga di comando; per il momento ignoriamo la parte di codice
evidenziata in rosso.
Allinizio viene stampato un prompt senza inviare a capo (si
noti lutilizzo del metodo print(String) al posto di
println(String)), dopodiché viene creato un oggetto di tipo
BufferedReader che si occupa di leggere la linea tramite
il metodo readLine().
La stringa immessa viene assegnata alla variabile s, che
in seguito viene controllata per vedere se contiene un valore corretto.
Questo controllo viene effettuato tramite un if, la cui espressione
contiene loperatore || visto nella lezione 20.
In questa espressione lordine in cui vengono effettuati i
controlli è importante: con questordine si controlla prima
che s non sia un oggetto null e poi, se s non
è null, si controlla che la sua lunghezza non sia 0.
Invertendo lordine, se s è null viene segnalato
un errore del tipo Null pointer exception durante lesecuzione,
il che non è molto gradevole.
Nelle istruzioni successive viene invocato due volte il metodo
controllaCarattere(char), passandogli come parametro il primo
e lultimo carattere della stringa immessa dallutente.
Poi, con una procedura analoga alla precedente, viene letta unaltra
stringa dalla riga di comando da ricercare allinterno di quella
letta in precedenza.
Per fare ciò è stato utilizzato il metodo substring della
classe String, la cui segnatura è:
public String substring(int beginIndex, int endIndex)
Questo metodo ritorna una stringa che è una sottostringa delloggetto
sul quale viene invocato; tale sottostringa inizia dalla posizione
beginIndex e finisce alla posizione endIndex.
La stringa ritornata viene poi confrontata con quella immessa dallutente
(memorizzata nella variabile c) tramite il metodo equals(Object),
che ritorna true se il confronto ha esito positivo, false
in caso contrario; ogni volta che il test è positivo (cioè è stata
trovata una sottostringa di s uguale a c) viene incrementato
un contatore.
Notiamo, nellultima istruzione di stampa, che per stampare
il carattere doppio apice, utilizzato in Java per delimitare
le stringhe, si utilizza \, che indica al compilatore di ignorare
il doppio apice seguente e di considerarlo come parte della stringa.
Nella prossima lezione capiremo il significato del codice evidenziato
in rosso.
Torna all'indice Generale del corso di Corso di Java di Software Planet