JavaRush /Java Blog /Random-IT /Pausa caffè #220. Come correggere le eccezioni in Java: u...

Pausa caffè #220. Come correggere le eccezioni in Java: una guida dettagliata

Pubblicato nel gruppo Random-IT
Fonte: JavaTechOnline Questo tutorial ti aiuterà a imparare come correggere le eccezioni comuni in Java. Oltre alla teoria, vedrai esempi di codice per risolvere tali problemi. Pausa caffè #220.  Come correggere le eccezioni in Java - Una guida dettagliata - 1Come con altri linguaggi di programmazione, gli sviluppatori Java potrebbero riscontrare errori o eccezioni durante la scrittura del codice. Le eccezioni dovrebbero essere prese sul serio poiché il loro verificarsi richiede tempo di lavoro. Tuttavia, con un po’ di conoscenza, è possibile accelerare la risoluzione della maggior parte di questi problemi. Quindi, impariamo come correggere le eccezioni comuni in Java.

Linee guida generali per evitare eccezioni in Java

Per evitare di generare eccezioni in Java, è importante comprendere e seguire le linee guida sulla codifica:
  1. Convalida sempre l'input dell'utente prima di utilizzarlo nel codice.
  2. Usa try-catch , lancia , lancia blocchi , a seconda di ciò che è appropriato per un particolare scenario.
  3. Non trascurare i messaggi nel codice relativi all'elaborazione e agli errori. Ciò aiuterà a identificare e correggere i problemi.
  4. Assicurati di registrare le eccezioni a scopo di debug. È possibile utilizzare i messaggi del logger per identificare i problemi.
  5. Segui le migliori pratiche di codifica per evitare eccezioni e testare accuratamente il tuo codice.
  6. Aggiorna le dipendenze API per assicurarti di utilizzare le versioni più recenti e stabili di librerie e framework.
  7. Utilizza gli strumenti e i framework di test necessari per identificare potenziali problemi nel codice prima che generino eccezioni.
  8. Monitora le prestazioni e i registri della tua applicazione per identificare e risolvere rapidamente eventuali problemi.
  9. Rimani aggiornato sulle migliori pratiche di sicurezza per garantire che il tuo codice sia sicuro e protetto da eventuali attacchi.
  10. Documenta accuratamente il tuo codice e le sue eccezioni per renderlo più facile da comprendere e gestire da parte di altri sviluppatori.

Elenco delle eccezioni più comuni in Java

Java ha un elenco abbastanza lungo di eccezioni. Diamo un'occhiata ad alcuni dei più comuni:

NullPointerException

NullPointerException è un tipo di eccezione RuntimeException . Si verifica quando proviamo a utilizzare una variabile di riferimento che ha un valore nullo. Ciò significa che punta a un oggetto o una variabile il cui valore è null . Un errore del genere può verificarsi quando proviamo a chiamare un metodo o ad accedere a un campo di un oggetto che non è stato inizializzato, oppure quando passiamo null come parametro a un metodo che non lo gestisce. Per evitare che venga generata una NullPointerException , è possibile verificare se una variabile di riferimento è nulla utilizzando l' operatore == . Se questo è il caso, allora il caso nullo deve essere gestito correttamente. In alternativa, possiamo inizializzare le nostre variabili sui valori predefiniti (ove possibile) per assicurarci di non incontrare mai un riferimento nullo. Un altro modo per evitare una NullPointerException è utilizzare la classe Opzionale . In Java, un Opzionale è un oggetto contenitore che può o meno contenere un valore non nullo. Viene utilizzato per rappresentare la presenza o l'assenza di un valore, in modo simile a come viene utilizzato il valore null per rappresentare l'assenza di un valore. Se un programmatore tenta di accedere al valore vuoto di un oggetto opzionale , il programma non lancerà una NullPointerException ma restituirà invece un oggetto opzionale vuoto . In altre parole, Optional forza il programmatore a gestire il caso in cui manca il valore, il che aiuta a evitare una NullPointerException .

IndexOutOfBoundsException

IndexOutOfBoundsException è un'eccezione di runtime che viene generata quando l'indice utilizzato per accedere a una matrice o a una raccolta è negativo o maggiore o uguale alla dimensione della matrice o della raccolta. Per evitare che si verifichi questa eccezione, dobbiamo assicurarci che l'indice utilizzato per accedere all'array o alla raccolta sia entro i suoi limiti, ovvero deve essere maggiore o uguale a zero e inferiore alla dimensione dell'array o della raccolta.

Indice della Matrice Fuori Dai Limiti d'Eccezione

ArrayIndexOutOfBoundsException è un tipo di IndexOutOfBoundsException che viene generato quando si tenta di accedere a una matrice in corrispondenza di un indice non valido. In Java, gli indici dell'array iniziano da 0 e terminano con length()-1 , dove length() è il numero di elementi nell'array. Se provi ad accedere a un elemento in un indice esterno a questo intervallo, Java lancerà un'ArrayIndexOutOfBoundsException . Quando incontri un'ArrayIndexOutOfBoundsException , dovresti rivedere il tuo codice per assicurarti di utilizzare gli indici corretti quando accedi agli elementi nell'array.

StringIndexOutOfBoundsException

StringIndexOutOfBoundsException è un tipo IndexOutOfBoundsException che viene generato quando si tenta di accedere a un carattere in una stringa con un indice non valido. Come con il precedente ArrayIndexOutOfBoundsException , ricorda che in Java, l'indice di una stringa inizia con 0 e termina con length()-1 , dove length() è il numero di caratteri nella stringa. Se provi ad accedere a un carattere in un indice esterno a questo intervallo, potresti riscontrare una StringIndexOutOfBoundsException . Se riscontri una StringIndexOutOfBoundsException , dovresti rivedere il tuo codice per assicurarti di utilizzare gli indici corretti quando accedi ai caratteri nella stringa.

ClassCastException

Questa eccezione si verifica quando proviamo a convertire un oggetto in un tipo che non è compatibile con il suo tipo effettivo. Per risolvere un problema come questo, è importante assicurarsi che il programma Java tenti solo di trasmettere oggetti alle classi di cui sono istanze. Puoi verificare il tipo di un oggetto utilizzando l' operatore istanzaof prima di applicare il cast.

IllegalArgumentException

IllegalArgumentException è un tipo di RuntimeException che viene generato quando un metodo viene chiamato con un argomento illegale o inappropriato. In altre parole, questo errore può verificarsi quando un metodo viene chiamato con un argomento che non rientra nell'intervallo previsto o non ha il formato o la struttura previsti. Ad esempio, un metodo richiede un numero positivo come argomento e noi forniamo un numero negativo, che costituisce un input non valido. Se incontri una IllegalArgumentException , dovresti controllare il tuo codice per assicurarti di chiamare metodi con argomenti validi e appropriati.

IllegalStateException

IllegalStateException è un tipo di RuntimeException che viene generato quando un oggetto si trova in uno stato inappropriato per l'operazione eseguita. Ciò può verificarsi se viene chiamato un metodo su un oggetto che non si trova nello stato previsto. Ad esempio, se creiamo un oggetto di connessione al database e poi lo chiudiamo. Quindi, se proviamo a creare un oggetto Statement in una connessione chiusa, verrà lanciata un'eccezione IllegalStateException perché il metodo createStatement() richiede una connessione aperta. Se incontri una IllegalStateException , dovresti rivedere il tuo codice per assicurarti di chiamare metodi su oggetti che si trovano nello stato appropriato.

Eccezione operazione non supportata

UnsupportedOperationException è un tipo RuntimeException che viene generato quando viene effettuato un tentativo di eseguire un'operazione non supportata su un oggetto. Questo errore può verificarsi quando chiamiamo un metodo che non è implementato dall'oggetto o non è supportato dall'oggetto. Per evitare che venga lanciata un'eccezione, non dovremmo chiamare operazioni che non sono supportate sugli oggetti. Dobbiamo rivedere il nostro codice per assicurarci di chiamare metodi su oggetti che supportano l'operazione.

ArithmeticException

ArithmeticException è un tipo di RuntimeException che viene generato quando un'operazione aritmetica produce un risultato non valido. Questa eccezione può verificarsi quando proviamo a eseguire un'operazione aritmetica con un argomento non valido o non valido. Ad esempio, quando si tenta di dividere per zero. Per risolvere questo problema, possiamo eseguire la convalida dell'input e garantire che gli argomenti soddisfino le condizioni richieste prima di eseguire l'operazione aritmetica.

SecurityException

SecurityException è un tipo di RuntimeException che viene generato quando si verifica una violazione della sicurezza durante l'esecuzione del programma. Questo errore può verificarsi quando un programma tenta di eseguire un'operazione non consentita dalla politica di sicurezza. Per risolvere il problema, dobbiamo assicurarci di avere accesso alle risorse ed eseguire operazioni per le quali disponiamo di un'autorizzazione specifica.

NumberFormatException

NumberFormatException è un tipo di RuntimeException che viene generato quando viene chiamato un metodo per convertire una stringa in un formato numerico, ma la stringa non è nel formato appropriato. Per risolvere questo problema, dobbiamo prima convalidare l'input dell'utente prima di tentare di convertirlo. Controlla anche il tuo codice per assicurarti di provare a convertire stringhe formattate in modo appropriato per il tipo numerico di destinazione.

InterruptedException

InterruptedException è un'eccezione verificata che viene generata se un thread è in attesa, in sospensione o in blocco per un evento e tale evento viene interrotto da un altro thread. L'errore può verificarsi quando un thread è in attesa di input, rilascia un blocco o completa qualche altra operazione e un altro thread interrompe il thread in attesa. Per risolvere questo problema, puoi rilevare InterruptedException e rispondere ripulendo le risorse, interrompendo il thread o intraprendendo altre azioni appropriate. Se riscontri un'InterruptedException , dovresti controllare il tuo codice per assicurarti di gestire correttamente le interruzioni del thread.

FileNotFoundException

FileNotFoundException è un'eccezione verificata che viene generata quando un programma tenta di accedere a un file che non esiste o non può essere trovato nella posizione specificata. Può apparire se un file viene scritto in modo errato, spostato o eliminato o anche quando un programma non dispone delle autorizzazioni necessarie per accedere al file. Per correggere l'errore, è possibile eseguire la convalida dell'input per garantire che il percorso del file sia corretto e che il programma disponga delle autorizzazioni necessarie per accedere al file.

IOException

IOException è un'eccezione verificata in Java che rappresenta un errore riscontrato durante l'esecuzione di operazioni di input o output, come la lettura o la scrittura su un file o un socket di rete. Può verificarsi per diversi motivi, ad esempio il file specificato mancante o inaccessibile, un errore di rete o autorizzazioni insufficienti. Per risolvere il problema, è necessario eseguire diverse azioni come controllare il messaggio di errore, gestire l'eccezione utilizzando try-catch , chiudere le risorse, controllare i permessi del file e così via.

NoSuchMethodException

NoSuchMethodException è un'eccezione che viene lanciata in fase di runtime quando proviamo a chiamare un metodo che non esiste nella classe. Questa eccezione di solito si verifica se chiamiamo un metodo utilizzando Class.getMethod() o Class.getDeclaredMethod() e il nome del metodo specificato non viene trovato nella classe o nell'interfaccia. Può verificarsi un'eccezione anche quando proviamo a chiamare un metodo utilizzando la classe java.lang.reflect.Method e il nome del metodo specificato non esiste nell'oggetto. Per evitare questa eccezione, assicurati di chiamare un metodo valido con la firma del metodo e lo specificatore di accesso corretti.

NoSuchFieldException

NoSuchFieldException è un'eccezione di runtime che si verifica quando proviamo ad accedere a un campo che non è nella classe. Questa eccezione di solito si verifica quando chiamiamo un metodo utilizzando Class.getField() o Class.getDeclaredField() e il nome del campo specificato non viene trovato nella classe o nell'interfaccia. Inoltre, può essere chiamato anche se stiamo tentando di accedere a un campo utilizzando la classe java.lang.reflect.Field e il nome del campo specificato non esiste nell'oggetto. Per evitare questa eccezione, assicurati di accedere a un campo valido con il nome e i modificatori di accesso corretti. Se stai accedendo a un campo privato, assicurati di utilizzare il metodo getDeclaredField() invece del metodo getField() .

IllegalAccessException

IllegalAccessException è un'eccezione di runtime che si verifica quando proviamo ad accedere a un campo o un metodo in una classe ma non disponiamo dei diritti di accesso richiesti. Questa eccezione di solito appare quando proviamo ad accedere a un campo o metodo privato dall'esterno di una classe o quando proviamo ad accedere a un campo o metodo protetto da una classe che non è una sottoclasse della classe originale. Può anche essere chiamato quando si tenta di accedere a un campo o metodo che è stato contrassegnato come non disponibile dalla classe java.lang.reflect.AccessibleObject . Per evitare questo problema, assicurati di disporre delle autorizzazioni necessarie sul campo o sul metodo a cui stai tentando di accedere. Se il campo o il metodo è privato, potrebbe essere necessario utilizzare la riflessione e impostare AccessibleObject su true (per accedervi). Tuttavia, fai attenzione quando usi la riflessione per accedere a campi o metodi privati, poiché potrebbe interrompere l'incapsulamento e compromettere l'integrità della classe.

VerificaErrore

VerifyError è un errore di runtime che è una sottoclasse di LinkageError . Si verifica quando Java Virtual Machine (JVM) incontra un file di classe che viola determinate regole di convalida. Quando viene compilata una classe Java, il compilatore controlla se il bytecode segue determinate regole e restrizioni, come l'indipendenza dai tipi e l'uso corretto dello stack e delle variabili locali. Se un file di classe viola queste regole, la JVM genererà un VerifyError durante il caricamento e il controllo della classe in fase di runtime. Per evitare VerifyError , assicurati che il tuo codice segua la sintassi e la semantica corrette del linguaggio Java. Se riscontri un VerifyError , dovresti controllare il tuo codice per assicurarti che sia valido e che non vi siano violazioni delle regole di verifica del bytecode Java.

Errore di memoria esaurita

OutOfMemoryError è una sottoclasse di Error , un tipo Throwable che introduce gravi problemi che non possono essere risolti in fase di runtime. Anche se Java 8 include alcuni miglioramenti nella raccolta dei rifiuti e nella gestione della memoria, potresti comunque riscontrare un OutOfMemoryError se l'applicazione utilizza troppa memoria o gestisce l'utilizzo della memoria in modo errato. Per evitare OutOfMemoryError , è necessario gestire correttamente l'utilizzo della memoria nell'applicazione Java. Ciò implica l'utilizzo di strutture dati e algoritmi che utilizzano la memoria in modo efficiente, evitando la creazione di oggetti non necessari ed eliminando correttamente gli oggetti quando non sono più necessari. Inoltre, puoi aumentare la dimensione heap massima per la JVM utilizzando il flag -Xmx durante l'esecuzione del programma Java.

Errore StackOverflow

StackOverflowError è un tipo di errore che si verifica quando la dimensione dello stack richiesta da un programma supera la quantità di memoria ad esso allocata. Può verificarsi quando un programma chiama troppi metodi annidati o quando un metodo chiama se stesso in modo ricorsivo troppe volte, risultando in un ciclo infinito. La Java Virtual Machine (JVM) alloca una quantità fissa di memoria per lo stack di esecuzione, che viene utilizzata per tenere traccia delle chiamate ai metodi e delle variabili locali. Quando lo stack va in overflow, la JVM genera un StackOverflowError . Per evitare StackOverflowError , è importante assicurarsi che il programma Java faccia un uso adeguato della ricorsione e delle chiamate ai metodi. Se riscontri un StackOverflowError , puoi provare ad aumentare la dimensione dello stack utilizzando il flag -Xss durante l'esecuzione del programma Java.

InvocationTargetException

InvocationTargetException è un'eccezione verificata generata dal meccanismo di riflessione Java. Fa parte del pacchetto java.lang.reflect.InvocationTargetException e viene utilizzato per indicare che si è verificata un'eccezione durante l'invocazione di un metodo o di un costruttore. Quando un metodo o un costruttore viene richiamato utilizzando il meccanismo di riflessione Java, viene chiamato il metodo invoke() della classe java.lang.reflect.Method o java.lang.reflect.Constructor . Se il metodo o il costruttore richiamato genera un'eccezione, il metodo invoke() la rileva e la racchiude in una InvocationTargetException . Questa eccezione viene quindi passata al chiamante del metodo invoke() . Per correggere InvocationTargetException , dobbiamo rilevarla, ottenere l'eccezione della causa principale utilizzando il metodo getCause() e gestire l'eccezione della causa principale di conseguenza. Tieni presente che la causa principale potrebbe essere un'eccezione verificata o un'eccezione di runtime, quindi assicurati di gestirla correttamente.

Modi per correggere le eccezioni più comuni in Java

Come risolvere NullPointerException

Scenario: hai un metodo che accede a un oggetto che ha il valore null .

String title= null;
System.out.println(title.length()); // Это вызовет NullPointerException
Soluzione n. 1: verificare se l'oggetto è nullo prima dell'uso.

if(title!= null) {
   System.out.println(title.length());
} else {
   System.out.println("title is null");
}
Soluzione n. 2: utilizzare Opzionale per evitare NullPointerException .

Optional<String> optionalTitle = Optional.ofNullable(getTitle());
if (optionalTitle.isPresent()) { 
   String title= optionalTitle.get(); 
   System.out.println("Title: " + title);
} else { 
   System.out.println("Title is not available.");
}

Come risolvere l'eccezione ArrayIndexOutOfBoundsException

Scenario: stai tentando di accedere a un array in un indice che è al di fuori dei suoi limiti.

int[] numbers = {4, 5, 6};
System.out.println(numbers[3]);   // Это вызовет ArrayIndexOutOfBoundsException
Soluzione: controlla la lunghezza dell'array prima di accedervi e assicurati di utilizzare indici validi.

int[] numbers = {4, 5, 6};
if (numbers.length > 3) {
   System.out.println(numbers[3]);
} else {
   System.out.println("ArrayIndexOutOfBoundsException: Please use valid indexes of the Array");
}

Come risolvere ClassCastException

Scenario: stai tentando di eseguire il cast di un oggetto su un tipo che non è compatibile con il suo tipo effettivo.

Object obj = "Java Exception";
Integer number = (Integer) obj; // Это вызовет ClassCastException
Soluzione: assicurati di eseguire il cast degli oggetti solo sui tipi con cui sono compatibili.

Object obj = "Java Exception";
if(obj instanceof Integer) {
   Integer number = (Integer) obj;
   System.out.println(number);
} else {
   System.out.println("Object cannot caste to Integer");
}

Come risolvere IllegalArgumentException

Scenario: hai passato un argomento non valido a un metodo.

public void printNumber(int number) {
   if(number <= 0) {
      throw new IllegalArgumentException("You cannot pass a negative number or zero");
   }
   System.out.println(number);
}

printNumber(-1); // Это вызовет IllegalArgumentException
Soluzione: assicurati di passare argomenti validi ai metodi. In questo caso, passa un numero positivo.

printNumber(1); //  Это успешно напечатает 1.

Come risolvere IllegalStateException

Scenario: l'oggetto è in uno stato non valido.

public class Bike {

   private Boolean isStarted;

   public void start() {
      if(isStarted) {
        throw new IllegalStateException("Bike is already started");
      }
      isStarted = true;
      System.out.println("Bike started");
   }
}

Bike bike= new Bike();
bike.start();
bike.start(); // Это вызовет IllegalStateException потому что bike is already started
Soluzione: assicurarsi di mantenere correttamente lo stato dell'oggetto.

Bike bike= new Bike();
bike.start();

Come risolvere UnsupportedOperationException

Scenario: si utilizza un'operazione non supportata da un oggetto. Un esempio popolare è quando utilizzi l' operazioneremove () su una raccolta immutabile, probabilmente vedrai un'eccezione UnsupportedOperationException .

List<String> list = Arrays.asList("Java", "Angular", "Spring");
list.add("Python"); // Это вызовет UnsupportedOperationException
Poiché il metodo Arrays.asList() restituisce un elenco immutabile, non supporta l'aggiunta o la rimozione di elementi. Soluzione: assicurati di chiamare solo le operazioni supportate sugli oggetti.

List<String> list = new ArrayList<>(Arrays.asList("Java", "Angular" "Spring"));
list.add("Python");
System.out.println(list);

Come risolvere ArithmeticException

Scenario n. 1: stai tentando di eseguire un'operazione di divisione di numeri interi che produce un risultato frazionario.

int i = 10;
int j = 4;
int k = i/j; // Это вызовет исключение ArithmeticException: целочисленное деление будет дробным
Qui il risultato dell'operazione di divisione è 2,5, che è un valore frazionario. Poiché gli interi non possono memorizzare valori frazionari, viene lanciata un'ArithmeticException . Soluzione: per evitare questa eccezione, possiamo utilizzare un tipo di dati che supporti valori frazionari, come double , per memorizzare il risultato dell'operazione di divisione. Ecco un esempio:

int i = 10;
int j = 4;
double k = (double) i/j;
Scenario n. 2: provi a dividere per zero e ottieni questa eccezione. Questo è lo scenario più comune.

int i = 4;
int j = 0;
int k = i/j; // Это вызовет исключение ArithmeticException: нельзя делить на ноль
Soluzione: gestire correttamente la divisione per zero. Ad esempio, il codice seguente illustra l'elaborazione corretta.

int i = 4;
int j = 0;
if(j != 0) {
int k = i/j;
System.out.println(k);
} else {
System.out.println("ArithmeticException: Cannot divide by zero");
}

Come risolvere l'eccezione IndexOutOfBoundsException

Scenario: stai tentando di accedere a una raccolta con un indice esterno ad essa.

List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
System.out.println(list.get(3)); // Это вызовет IndexOutOfBoundsException
Soluzione: controlla la dimensione della raccolta prima di accedervi e assicurati di utilizzare indici validi.

List<String> list = Arrays.asList("Apple", "Papaya", "Mango");
if (list.size() > 3) {
   System.out.println(list.get(3));
} else {
   System.out.println("You are using the Index which is out of bounds");
}

Come risolvere IOException

Scenario: un'operazione di input/output non riesce perché il file non è accessibile.

try {
   File inputFile = new FileReader("pqr.txt");
   BufferedReader reader = new BufferedReader(inputFile);
   String line = reader.readLine();
   System.out.println(line);
} catch (IOException e) {
   e.printStackTrace();
}
Soluzione: gestire gli errori I/O e assicurarsi che le risorse siano chiuse correttamente.

File inputFile = new File("pqr.txt");

if (!inputFile.exists() || !inputFile.canRead()) { 
 System.out.println("The input file is missing or not readable."); 
 return;
}

try {
BufferedReader reader = new BufferedReader(inputFile);
 String line = reader.readLine();
 System.out.println(line);
  reader.close();
} catch (IOException e) {
 e.printStackTrace();
}
Tieni presente che in alternativa possiamo utilizzare la funzionalità try-with-resource introdotta in Java 7 per chiudere automaticamente le risorse come mostrato di seguito. Possiamo dichiarare una o più risorse in un'istruzione try e Java chiuderà automaticamente le risorse alla fine del blocco, indipendentemente dal fatto che il blocco venga completato normalmente o venga generata un'eccezione.

try (BufferedReader reader = new BufferedReader(new FileReader("pqr.txt"))) {
....
} catch {
....
}

Come risolvere FileNotFoundException

Scenario: il file non è stato trovato nella posizione specificata.

try {
     BufferedReader reader = new BufferedReader(new FileReader("abc.txt"));
     String line = reader.readLine();
     System.out.println(line);
     reader.close();
} catch (FileNotFoundException | IOException e) {
     System.out.println("An error has occurred while reading the file: " + e.getMessage());
} 
Soluzione: assicurati che il file esista e di disporre delle autorizzazioni appropriate per accedervi.

try {
    File file = new File("abc.txt");
    if(!file.exists()) {
    throw new FileNotFoundException("File not found at the specified location");
    }
    BufferedReader reader = new BufferedReader(new FileReader(file));
    String line = reader.readLine();
    System.out.println(line);
    reader.close();
} catch (IOException e) {
    e.printStackTrace();
}

Come risolvere NoSuchMethodException

Scenario: se stai tentando di accedere a un metodo che non può essere trovato.

public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass obj = new TestClass();
Method method = obj.getClass().getMethod("printHello"); // Это вызовет NoSuchMethodException
Soluzione: verificare che il metodo esista e che il nome e la firma del metodo siano corretti.

public class TestClass {
   public void sayHello() {
      System.out.println("Hello");
   }
}

TestClass  obj = new TestClass();
try {
    Method method = obj.getClass().getMethod("sayHello");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

Come risolvere ConcurrentModificationException

Scenario: una raccolta cambia durante l'iterazione.

List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
for (String str : list) {
  list.remove(str);  // Это вызовет ConcurrentModificationException
}
Soluzione: utilizzare un iteratore per scorrere una raccolta e modificarla utilizzando i metodi dell'iteratore.

List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String str = iterator.next();
    iterator.remove();
}
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION