Ошибка, попробовав удалять элемент, возразила ArrayList

Я пробую делать программу создавая ArrayList как будто говорилось о базе данных, чтобы сохранять имя и запас каждого продукта.

Добавив продукт все в порядке, но попробовав удалять один,, - когда он дает мне ошибку.

У программы есть меню, чтобы консультироваться, создавать, удалять статьи и подбери данные из-за scanner. Я оставляю им код, который у меня есть, и то, что я попробовал сделать, чтобы удалять элемент.

Ошибка, которая помечает меня, - java.util. ConcurrentModificationException. Если бы кто-то смог помогать, он был бы благодарен за это много и я надеюсь объясниться хорошо.

Главный класс я это не помещаю здесь, из-за которого единственной, что у него есть, является инициализация Магазина и while для того, чтобы он всегда просил у меня выбор.

Магазин

package main;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Tienda {

    ArrayList<Productos> productos = new ArrayList<Productos>();
    Iterator<Productos> it= productos.iterator();

    Scanner sc = new Scanner(System.in);

    public void menu() {
        System.out.println("1. Consultar\n2. Crear\n3. Borrar\n4. Salir");

        int opcion = sc.nextInt();

        switch(opcion) {

                case 1:
                    System.out.println("Lista de productos: ");
                    for(int i=0;i<productos.size();i++) {
                        System.out.println("Producto: "+productos.get(i).getNombre()+" --- Stock: "+productos.get(i).getStock());
                    }
                break;

                case 2:
                    System.out.println("Indique el nombre del producto para añadir: ");
                    String nombre = sc.next();
                    System.out.println("Indique el stock del producto para añadir: ");
                    int stock = sc.nextInt();
                    productos.add(new Productos(nombre,stock));
                    break;

                case 3:
                    System.out.println("Indique el nombre del producto a borrar: ");
                    String n = sc.next();

                    while(it.hasNext()) {
                        Productos p = it.next();
                        if(p.equals(n)) {
                            it.remove();
                        }
                    }           
                    break;

                case 4:
                    System.exit(0);

                    default:
                        System.out.println("Introduce una opcion correcta.");

                }
        }
}

Продукты

package main;

public class Productos {

    String nombre;
    int stock;

    public Productos(String nombre, int stock) {
        this.nombre=nombre;
        this.stock=stock;
    }

    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public int getStock() {
        return stock;
    }
    public void setStock(int stock) {
        this.stock = stock;
    }

}
0
задан 24.12.2019, 01:51
2 ответа

Проблема это у тебя есть, создав iterador на ArrayList vaciГі, так как mГЎs поздно ты стараешься действовать на твоем списке используя этот же самый iterador.


Упрощая проблему:

import java.util.ArrayList;
import java.util.Iterator;

public class App
{
    public static void main(String[] args)
    {
        Tienda theShop = new Tienda();

        theShop.test();
    }
}

class Tienda
{
    ArrayList<Producto> productos = new ArrayList<Producto>();
    Iterator<Producto> productsIterator = productos.iterator(); // Esto producira el BUG más adelante...

    public void test()
    {
        this.mockProducts();
        this.showExistingProducts();
    }

    private void showExistingProducts()
    {
        int productsQuantity = this.productos.size();
        System.out.println("Existen " + productsQuantity + " productos: ");

        while(productsIterator.hasNext()) {
            Producto p = productsIterator.next();
            System.out.println(" - " + p.getNombre());
        }
    }

    private void mockProducts()
    {
        System.out.println("Añadiendo productos...");
        this.productos.add(new Producto("Foo", 1));
        this.productos.add(new Producto("Baz", 5));
        this.productos.add(new Producto("Qx", 2));
    }
}

class Producto
{
    private String nombre;
    private int stock;

    public Producto(String nombre, int stock) {
        this.nombre=nombre;
        this.stock=stock;
    }

    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public int getStock() {
        return stock;
    }
    public void setStock(int stock) {
        this.stock = stock;
    }
}

И вывод программы serГЎ:

AГ±adiendo продукты...
Существуют 3 продукта:

Exception in thread "main" java.util. ConcurrentModificationException at java.base/java.util. ArrayList $Itr.checkForComodification (ArrayList.java:1042) at java.base/java.util. ArrayList $Itr.next (ArrayList.java:996) at Тьенда.совексистингпродуктс (App.java:38) at Тьенда.тест (App.java:23) at Апп.маин (App.java:10)


Hasta aquГ - только я воспроизвел твою проблему . Сейчас cГіdigo функционируя:

import java.util.ArrayList;
import java.util.Iterator;

public class App
{
    public static void main(String[] args)
    {
        Tienda theShop = new Tienda();

        theShop.test();
    }
}

class Tienda
{
    ArrayList<Producto> productos = new ArrayList<Producto>();
    Iterator<Producto> productsIterator = null;

    public void test()
    {
        this.mockProducts();
        this.showExistingProducts();
    }

    private void showExistingProducts()
    {
        int productsQuantity = this.productos.size();
        System.out.println("Existen " + productsQuantity + " productos: ");

        // Aquí creo el iterador sobre la lista actualizada de productos:
        productsIterator = this.productos.iterator();

        while(productsIterator.hasNext()) {
            Producto p = productsIterator.next();
            System.out.println(" - " + p.getNombre());
        }
    }

    private void mockProducts()
    {
        System.out.println("Añadiendo productos...");
        this.productos.add(new Producto("Foo", 1));
        this.productos.add(new Producto("Baz", 5));
        this.productos.add(new Producto("Qx", 2));
    }
}

class Producto
{
    private String nombre;
    private int stock;

    public Producto(String nombre, int stock) {
        this.nombre=nombre;
        this.stock=stock;
    }

    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public int getStock() {
        return stock;
    }
    public void setStock(int stock) {
        this.stock = stock;
    }
}


Сейчас вывод программы serГЎ:

AГ±adiendo продукты...
Существуют 3 продукта:
- Фу
- Бэз
- Qx


TendrГ-Схвати, что обновлять iterador каждый раз, когда ты стараешься действовать на списке продуктов (так как nГєmero продукты он может изменить). AquГ - я оставляю одну тебе versiГіn mГЎs полная программы (видеть и удалять продукты), отдельно у тебя есть один pequeГ±o неудача во время удаления продукта списка, который я исправил (anotaciГіn FIXED):

import java.util.ArrayList;
import java.util.Iterator;

public class App
{
    public static void main(String[] args)
    {
        Tienda theShop = new Tienda();

        theShop.test();
    }
}

class Tienda
{
    ArrayList<Producto> productos = new ArrayList<Producto>();
    Iterator<Producto> productsIterator = null;

    public void test()
    {
        this.mockProducts();
        this.showExistingProducts();

        this.deleteProductByName("Foo");
        this.showExistingProducts();
    }

    private void showExistingProducts()
    {
        int productsQuantity = this.productos.size();
        System.out.println("Existen " + productsQuantity + " productos: ");

        // Aquí creo el iterador sobre la lista actualizada de productos:
        productsIterator = this.productos.iterator();
        while(productsIterator.hasNext()) {
            Producto p = productsIterator.next();
            System.out.println(" - " + p.getNombre());
        }
    }

    private void deleteProductByName(String productName)
    {
        System.out.println("Eliminando producto '" + productName + "'...");

        // Aquí creo el iterador sobre la lista actualizada de productos:
        productsIterator = this.productos.iterator();
        if (this.productos.size() > 0) {
            while(productsIterator.hasNext()) {
                Producto p = productsIterator.next();
                if(p.getNombre().equals(productName)) { // FIXED:
                    productsIterator.remove();
                }
            }
        }
    }

    private void mockProducts()
    {
        System.out.println("Añadiendo productos...");
        this.productos.add(new Producto("Foo", 1));
        this.productos.add(new Producto("Baz", 5));
        this.productos.add(new Producto("Qx", 2));
    }
}

class Producto
{
    private String nombre;
    private int stock;

    public Producto(String nombre, int stock) {
        this.nombre=nombre;
        this.stock=stock;
    }

    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public int getStock() {
        return stock;
    }
    public void setStock(int stock) {
        this.stock = stock;
    }
}


И вывод:

AГ±adiendo продукты...
Существуют 3 продукта:
- Фу
- Бэз
- Qx
Eliminando продукт 'Фу'...
Существуют 2 продукта:
- Бэз
- Qx

1
ответ дан 24.12.2019, 21:45
  • 1
    Большое спасибо Orici, неудача состояла в том, что он инициализировал iterador сначала и не каждый раз, когда становится отвечающим современным требованиям arraylist, не comprendí в до настоящего времени. Приветствие. – Riancast 24.12.2019, 14:18

Ты должен инициализировать Iterator, непосредственно перед сделав консультацию, иначе выходит эта ошибка. Тогда ты можешь объявлять это наверху так:

Iterator<Productos> it;

Также помнит, что ты должен сравнивать p.getNombre(), не p.

Остался бы таким:

it = productos.iterator();
while (it.hasNext()) {
    Productos p = it.next();
    if (p.getNombre().equals(n)) {
        it.remove();
    }
}

Надеялся помочь тебе.

1
ответ дан 24.12.2019, 21:45
  • 1
    Большое спасибо DaniDekk, неудача была этой, который инициализировал iterador сначала и не каждый раз, когда он обновлял arraylist, приветствие. – Riancast 24.12.2019, 14:19