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

Сбой метода Java charAt() в цикле For

Следующий код должен считывать 5 строк из файла .dat, а затем печатать каждый отдельный символ из каждой строки.

File file = new File("tictactoe.dat");
Scanner scan = new Scanner(file);
String str = "";
int x;
for ( x = 0; x < numGames; x++) {
    str = scan.nextLine();
    for (int i = 0; i < str.length(); i++) {
        out.println(str.charAt(i));
    }
}

Но программа выдает StringIndexOutOfBoundsException. В Scanner нет ничего плохого, так как тесты показали, что он отлично считывает каждую строку в моем файле. Но при попытке получить, а затем напечатать определенный символ в каждой строке программа вылетает.

Странно, вне цикла charAt() работает без ошибок.

Почему вызов метода внутри цикла приводит к сбою программы?

ОБНОВЛЕНИЕ: я сделал нелепую ошибку, скопировав код, который использовал. См. обновленный код выше. Также программа "вылетает" из-за StringIndexOutOfBoundsException, которую я не улавливаю.

26.09.2012

  • Содержит ли каждая строка не менее numGames символов? 26.09.2012
  • Да, это так. Нет проблем с длиной строки. 26.09.2012
  • Когда вы говорите о сбое, вы имеете в виду фатальное исключение (что-то с трассировкой стека, на которое мы могли бы посмотреть) или сбой типа дампа JVM? 26.09.2012
  • Почему вы печатаете только один символ из каждой строки? Это должно напечатать первый символ первой строки, второй символ второй строки и т. д. Маловероятно, что вы захотите это сделать. 26.09.2012
  • Можете ли вы опубликовать трассировку стека ошибки? 26.09.2012
  • можете ли вы опубликовать 5 строк в файле и значение numGames также. 26.09.2012
  • Сделал глупую ошибку при копировании кода. См. обновленный вопрос выше. 27.09.2012

Ответы:


1

Ваш цикл не делает то, что вы хотите. Ты говоришь:

... а затем распечатать каждый отдельный символ из каждой строки.

Но на самом деле он получает строку 1 и печатает только первый символ из этой строки, затем получает вторую строку и печатает второй символ, третью строку и третий символ и так далее. Если вы печатаете каждый символ в отдельной строке, вам нужно иметь второй цикл внутри первого, который перебирает символы в строке, чтобы напечатать все их отдельные символы.

char[] characters = str.toCharArray();
for (int i = 0; i < characters.length; i++) {
    System.out.println(characters[i]);
}

Или даже лучше, если вы используете цикл for-each:

for (char c : str.toCharArray()) {
    System.out.println(c);
}
26.09.2012
  • Или просто System.out.println(str) и избегайте разборки строки и ее повторного соединения. 26.09.2012
  • Обратите внимание, что я использую println вместо print. Я сказал: «Если вы печатаете каждый символ в отдельной строке... Но да, конечно, если вы просто печатаете все символы в одной строке, тогда println(str) лучше. 26.09.2012
  • @TheKraken Ваше обновление, как написано, должно работать нормально. Это все еще создает вам проблемы? 27.09.2012
  • Спасибо за быстрый ответ. Я пробую тот же самый код, который использовал раньше, на другой машине, и он отлично работает. Следовательно, я не уверен, в чем была настоящая проблема. Однако сейчас код работает без каких-либо логических ошибок. 27.09.2012

  • 2

    Я ожидал, что ошибка будет StringIndexOutOfBoundsException, поскольку вы печатаете первую букву из первой строки, вторую букву из второй строки и т. д. Поскольку вы не проверяете, существует ли такая буква, наступает точка, где строка не так уж долго.

    Если это не причина, я бы

    • прочитайте сообщение об исключении в вопросе.
    • пройдитесь по коду с помощью отладчика, чтобы найти ошибку в коде.
    26.09.2012

    3

    вы перепутали количество строк с количеством символов в каждой строке

    File file = new File("tictactoe.dat");
    Scanner scan = new Scanner(file);
    String str = "";
    int x;
    int y;
    for ( x = 0; x < numGames; x++) {
        str = scan.nextLine();
        for (y = 0; y<str.length(); y++)
        {
            out.println(str.charAt(y));
        }
    }
    
    26.09.2012
  • Ты прав. На самом деле это был исходный код, который у меня был. Пожалуйста, смотрите обновленный вопрос. 27.09.2012

  • 4

    Что-то странное в вашей логике. Предполагая, что DAT:

    12345
    67890
    abcde
    fghij
    klmno
    

    Ваш код напечатает:

    1
    7
    c
    i
    o
    

    В конце концов, вы вызываете "scanLine" numGames раз и захватываете позицию X в каждой новой строке.

    26.09.2012
    Новые материалы

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

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

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

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

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

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

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