Nano Hash - криптовалюты, майнинг, программирование

Java — исключение IndexOutOfBoundsException

Я не новичок в Java, но и не эксперт, поэтому я публикую это для помощи/объяснения. Я искал во многих местах в Интернете, и там не было ответа, который я ищу.

public class Driver {

public static ArrayList<ArrayList<Integer>> theData; // ArrayList to store the     ArrayList of values
final static int dataSize = 20; // length of the line of data in the inFile

/***
 * Read in the data from the inFile. Store the current line of values
 * in a temporary arraylist, then add that arraylist to theData, then
 * finally clear the temporary arraylist, and go to the next line of 
 * data.
 * 
 * @param inFile
 */
public static void getData(Scanner inFile) {
    ArrayList<Integer> tempArray = new ArrayList<Integer>();
    int tempInt = 0;

    while (inFile.hasNext()) {
        for (int i = 0; i < dataSize; i++) {
            tempInt = inFile.nextInt();
            tempArray.add(tempInt);
        }
        theData.add(tempArray);
        tempArray.clear();
    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    Scanner inFile = null;
    theData = new ArrayList<ArrayList<Integer>>();

    System.out.println("BEGIN EXECUTION");

    try {
        inFile = new Scanner(new File("zin.txt"));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        getData(inFile);
    }
    System.out.println(theData.get(5).get(5)); // IndexOutOfBoundsException here
    System.out.println("END EXECUTION");
  }

}

Я получаю исключение IndexOutOfBoundsException, где я его помечаю. Интересно то, что когда я пытался понять это, я проверил, правильно ли работает метод getData, поэтому, поскольку метод повторялся в цикле while в getData, я распечатал размер массива-theData, И размер массивов в массиве theData, и что вы знаете, он вернул правильный размер и значение. Таким образом, в основном, когда вызывается getData, он работает правильно и сохраняет значения, но когда я пытаюсь вызвать значения в Main, в ArrayList нет значений.

У меня есть ощущение, что это как-то связано с тем, что я очищаю tempArray, который я добавлял к theData. Любая помощь будет здорово!

Спасибо


Ответы:


1

В этом коде

theData.add(tempArray);
tempArray.clear();

переменная tempArray является ссылкой на объект ArrayList. Вы добавляете эту ссылку в файл theData ArrayList. Когда вы вызываете для него clear(), вы очищаете тот же объект, ссылку на который вы передали theData. Вместо вызова clear() просто инициализируйте новый ArrayList.

25.09.2013
  • Спасибо! Глупая ошибка с моей стороны. Единственная причина, по которой я сделал это таким образом, заключается в том, что я сделал это для аналогичного проекта для C++ (который позволяет вам это сделать). 25.09.2013
  • @CraiGreen Пожалуйста. Уделите несколько минут чтению Является ли передача Java по ссылке. Кроме того, рассмотрите возможность принятия ответа, если он охватывает все. 25.09.2013
  • Я так и сделал — просто пришлось подождать несколько минут, пока StackOverflow разрешит мне. 25.09.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..