English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Qual è la causa del NoSuchElementException e come si ripara in Java?

Qual è la causa del NoSuchElementException e come si ripara in Java?

Un'eccezione è un problema che si verifica durante l'esecuzione del programma (errore di tempo di esecuzione). Quando si verifica un'eccezione, il programma si interrompe bruscamente e il codice dopo la riga dell'eccezione non verrà mai eseguito. Ogni eccezione è rappresentata dalla sua classe.

Causa dell'eccezione NoSuchElementException

Questa è un'eccezione di tempo di esecuzione, ovvero si verifica durante l'esecuzione.

Se provate a ottenere un elemento da un oggetto vuoto, o a accedere al contenuto di una collezione, array o altro oggetto utilizzando i metodi di accesso di Enumeration, Iterator o tokenizer (ad esempio next() o nextElement()), e cercate di ottenere il prossimo elemento dopo aver raggiunto la fine dell'oggetto (collezione, array o altro oggetto), viene generata l'eccezione NoSuchElementException.

Ad esempio:

  • Se si chiama il metodo nextElement() della classe Enumeration su un oggetto enum vuoto, o se la posizione corrente è alla fine dell'Enumeration, viene generata in tempo di esecuzione l'eccezione NoSuchElementException.

  • Se si utilizza il metodo nextElement() o nextToken() della classe StringTokenizer su un oggetto StringTokenizer vuoto, o se la posizione corrente è alla fine del StringTokenizer, viene generata in tempo di esecuzione l'eccezione NoSuchElementException.

  • Se il metodo next() della classe Iterator o ListIterator viene chiamato su un Iterator / ListIterator vuoto, o se la posizione corrente è alla fine, viene generato in tempo di esecuzione l'eccezione NoSuchElementException dell'Iterator / listIterator.

  • Similmente, se si chiama il metodo previous() della classe ListIterator su un oggetto ListIterator vuoto, o se la posizione corrente è l'inizio dell'iteratore, verrà generato un NoSuchElementException durante l'esecuzione.

Esempio

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Hello how are you";
      //Instanziando la classe StringTokenizer
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //Stampando tutti i token
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      // Ottenere il token successivo dopo aver raggiunto la fine
      tokenizer.nextToken();
      tokenizer.nextElement();
   }
}

Errore durante l'esecuzione

Hello
how
are
you
Exception in thread "main" java.util.NoSuchElementException
   at java.util.StringTokenizer.nextToken(Unknown Source)
   at MyPackage.StringTokenizerExample.main(StringTokenizerExample.java:16)

Gestione/riparazione di NoSuchElementException

Quasi tutte le classi che causano NoSuchElementException nei loro metodi di accesso contengono i loro metodi per verificare se l'oggetto (insieme, generatore di token, ecc.) contiene più elementi.

Ad esempio:

  • La classe Enumeration contiene il metodo hasMoreElements(), che restituisce true se l'oggetto contiene più elementi dopo la posizione corrente (altrimenti restituisce false).

  • La classe StringTokenizer contiene i metodi hasMoreTokens() e hasMoreElements(), che restituiscono true se l'oggetto contiene più elementi dopo la posizione corrente (altrimenti restituisce false).

  • La classe Iterator contiene il metodo hasNext(), che restituisce true se l'iteratore corrente contiene più elementi accanto alla posizione corrente (altrimenti restituisce false).

  • La classe ListIterator contiene il metodo hasPrevious(), che restituisce true se l'iteratore corrente contiene più elementi prima della posizione corrente (altrimenti restituisce false).

Nel ciclo while, utilizzare questi metodi per verificare se l'oggetto corrispondente contiene più elementi, stampare/accedere all'elemento solo quando la condizione è true. Quando l'oggetto non contiene elementi o si è raggiunto l'ultimo elemento, questo può prevenire l'accesso agli elementi tramite i metodi di accesso.

Metodo hasMoreElements() della classe Enumeration

import java.util.Enumeration;
import java.util.Vector;
public class EnumExample {
   public static void main(String args[]) {
      //Instanziando un Vector
      Vector<Integer> vec = new Vector<Integer>( );
      //Popolando il vettore
      vec.add(1254);
      vec.add(4587);
      //Rettrovando gli elementi utilizzando l'Enumeration
      Enumeration<Integer> en = vec.elements();
      while(en.hasMoreElements()) {
         System.out.println(en.nextElement());
      }
   }
}

Risultato di output

1254
4587

Metodo nextMoreTokens() della classe StringTokenizer-

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Hello how are you";
      //Instanziando la classe StringTokenizer
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //Stampando tutti i token
      while(tokenizer.hasMoreTokens()) {
         System.out.println(tokenizer.nextToken());
      }
   }
}

Risultato di output

Hello
how
are
you

Metodo hasNext() della classe Iterator-

import java.util.ArrayList;
import java.util.Iterator;
public class NextElementExample{
   public static void main(String args[]) {
      //Creazione di un oggetto ArrayList
      ArrayList<String> list = new ArrayList<String>();
      //Popolamento dell'ArrayList
      list.add("mele");
      list.add("mango");
      list.add("arance");
      //Ottengo l'oggetto Iterator dell'ArrayList
      Iterator it = list.iterator();
      while(it.hasNext()) {
         System.out.println(it.next());
      }
   }
}

Risultato di output

mele
mango
arance

Metodo hasPrevious() della classe ListIterator-

import java.util.ArrayList;
import java.util.ListIterator;
public class NextElementExample{
   public static void main(String args[]) {
      //Creazione di un oggetto ArrayList
      ArrayList<String> list = new ArrayList<String>();
      //Popolamento dell'ArrayList
      list.add("mele");
      list.add("mango");
      list.add("arance");
      //Ottengo l'oggetto Iterator dell'ArrayList
      ListIterator<String> it = list.listIterator();
      while(it.hasNext()) {
         it.next();
      }
      while(it.hasPrevious()) {
         System.out.println(it.previous());
      }
   }
}

Risultato di output

arance
mango
mele