English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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(); } }
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)
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