Перебирать массивы объектов и возвращать каждый атрибут класса - PullRequest
1 голос
/ 11 июля 2020

Я создал пять классов -> GeneralData, MaterialData, WeigthsAndDimensions, TechnicalData, LogisticData. У всех классов есть несколько атрибутов. Я также создал класс Material, конструктор которого имеет пять атрибутов Object:

package com.mmdmanager.others;

public class Material {
    private GeneralData generalData;
    private MaterialData materialData;
    private WeigthsAndDimensions weigthsAndDimensions;
    private TechnicalData technicalData;
    private LogisticData logisticData;

    public Material(GeneralData generalData, MaterialData materialData, WeigthsAndDimensions weigthsAndDimensions, TechnicalData technicalData, LogisticData logisticData) {
        this.generalData = generalData;
        this.materialData = materialData;
        this.weigthsAndDimensions = weigthsAndDimensions;
        this.technicalData = technicalData;
        this.logisticData = logisticData;
    }

    @Override
    public String toString() {
        return generalData + "," + materialData + "," + weigthsAndDimensions + "," + technicalData + "," + logisticData;
    }
}

Мое приложение создает над одним объектом класса «Материал» и помещает все эти объекты в arrayylist:

Material material = new Material(generalData, materialData, weigthsAndDimensions, technicalData, logisticData);
materialList.add(material);

Мне нужно заставить алгоритм, который выполняет итерацию по каждому атрибуту всех пяти классов, включенных в объект «материал». Кроме того, если в списке материалов arrayylist более одного объекта, алгоритм должен перебирать каждый объект. Я создал такой код:

public ArrayList<Material> getMaterialList(ArrayList<Material> materialList, GeneralData generalData, MaterialData materialData, WeigthsAndDimensions weigthsAndDimensions, TechnicalData technicalData, LogisticData logisticData) {

    try {
        connection = ConnectionProvider.getConnection();
        while(!connection.isClosed()) {
            preparedStatement = connection.prepareStatement("insert into materials(material_name,product_number,user_id,request_datetime,esk_number,request_type,request_sub_type,remark,batch_number, product_hierarchy, gross_Weight, net_Weight, material_Length, material_Width, material_Height, material_Volume, Capacity_Unit_Of_Measure, inverter, POWER_SUPPLY, CEMARK, REFR_APPLICATION, REFR_MODE, REFRIGERANT_TYPE, REFRIGERANT_WEIGHT, FREQUENCY, COMPRESSOR_TYPE, PACKAGING_STYLE, SALES_OEM_PRODUCT, BUY_OEM_PRODUCT, INDOOR_OUTDOOR, DG_INDICATOR_PROFILE, SALES_BRAND, BUSINESS_PILAR, MATERIAL_SOURCE, FACTORY_NAME, DESTINATION_MARKET) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

            connection.setAutoCommit(false);
            iterator = materialList.iterator();

            while (iterator.hasNext()) {
                for (counter = 1; counter < 37; counter++) {
                    if ((counter > 0 && counter < 4) || (counter > 5 && counter < 11) || (counter == 32) || ((counter > 33 && counter < 37))) {
                        preparedStatement.setString(counter,String.valueOf(iterator.next()));
                    }
                    else if (counter == 4) {
                        preparedStatement.setTimestamp(counter, Timestamp.valueOf(String.valueOf(iterator.next())));
                    }
                    else if (counter == 5) {
                        preparedStatement.setInt(counter,Integer.valueOf(String.valueOf(iterator.next())));
                    }
                    else if ((counter > 10 && counter < 17) || (counter > 24 && counter <25)) {
                        preparedStatement.setDouble(counter, Double.valueOf(String.valueOf(iterator.next())));
                    }
                    else if ((counter > 16 && counter < 24) || (counter > 25 && counter < 32) || counter == 33) {
                        preparedStatement.setDouble(counter, Byte.valueOf(String.valueOf(iterator.next())));
                    }
                }
                preparedStatement.addBatch();
            }

            preparedStatement.executeBatch();
            connection.commit();
            connection.setAutoCommit(true);
            connection.close();
        }
    }
    catch (SQLException ex) {
        ex.printStackTrace();
        System.out.println(ex.getSQLState());
    }
    return materialList;
}

java .util.NoSuchElementException -> Произошла следующая ошибка, когда счетчик равен 2 и атрибут не может быть назначен на prepareStatement.setString ();

1 Ответ

1 голос
/ 12 июля 2020

Метод итератора next выдает NoSuchElementException, если в итерации больше нет элементов см. Java документацию . Вы проверяете, есть ли итератор hasNext в вашем while-l oop, но в вашем for-l oop вы вызываете next, не проверяя, есть ли следующий элемент.

Допустим, в вашем списке есть только один элемент. hasNext в то время как l oop возвращает true, вы вводите for-l oop. В for-l oop вы получаете первый элемент, увеличиваете свой счетчик до 2 и пытаетесь получить следующий элемент (которого не существует), и это вызывает NoSuchElementException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...