Corso di Java

Istruzioni Condizionali: esempio II

 

Riprendiamo l’esempio 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 un’applicazione 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 quest’ultimo possa utilizzarla come meglio crede, ad es. per scriverla in un campo di testo all’interno 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 dell’applicazione.
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.
All’inizio viene stampato un prompt senza inviare a capo (si noti l’utilizzo 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 l’operatore || visto nella lezione 20.
In questa espressione l’ordine in cui vengono effettuati i controlli è importante: con quest’ordine 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 l’ordine, se s è null viene segnalato un errore del tipo “Null pointer exception” durante l’esecuzione, il che non è molto gradevole.

Nelle istruzioni successive viene invocato due volte il metodo controllaCarattere(char), passandogli come parametro il primo e l’ultimo carattere della stringa immessa dall’utente.
Poi, con una procedura analoga alla precedente, viene letta un’altra stringa dalla riga di comando da ricercare all’interno 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 dell’oggetto sul quale viene invocato; tale sottostringa inizia dalla posizione beginIndex e finisce alla posizione endIndex.
La stringa ritornata viene poi confrontata con quella immessa dall’utente (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, nell’ultima 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