// Programma che implementa una lista, con eccezioni

class notfoundexception extends Exception {
}

class lista {
 lista next;                // Prossimo elemento della lista
 int dato;                  // Dato di questo elemento
 static lista base = null;  // Primo elemento della lista

 lista (int d) {  // Costruttore
   dato = d;      // Inizializza il dato
   next = base;   // Prende la lista corrente e la mette dopo
   base = this;   // Quindi si 'installa' come nuovo inizio lista
 }

 lista cerca (int val) throws notfoundexception { // Cerca, se non trova lancia eccezione
   if (val == dato)                               // Se il ndato corrisponde
     return this;                                 // Ha trovato, quindi ritorna 'se stesso'
   else if (next != null)                         // Altrimenti se c'e' un prossimo
     return next.cerca (val);                     // Continua con il prossimo
   else
     throw new notfoundexception ();              // Altrimenti lancia la nuova eccezione
 }

 public static void main (String [] args) { // Programma principale
   int i;
   for (i = 5; i < 10; i++)                 // 5 ripetizioni
     new lista (i);                         // 5 elementi di lista, con numeri da 5 a 9
   try {
     lista f = base.cerca (java.lang.Integer.parseInt (args [0])); // Cerca l'elemento chiesto dall'utente
     System.out.print ("Trovato elemento con valore ");            // Stampa l'elemento trovato
     System.out.println (f.dato);
   } catch (notfoundexception e) {                                 // Se non c'era (eccezione)
     System.out.println ("Non trovato alcun elemento");            // Stampa messaggio
   } catch (java.lang.ArrayIndexOutOfBoundsException e) {          // Se mancava il parametro (eccezione)
     System.out.println ("Devi indicare il numero da cercare sulla linea di comando"); // Stampa messaggio
   } 
   base = null;                           // Dereferenzia la radice, per elimenare la lista
 } 
}