Проблема с передачей значения в цикл

#java #arrays #io

#java #массивы #io

Вопрос:

Приведенный ниже код работает отлично, если текстовый файл состоит из строк чисел, но как только он доходит, например, до строки с надписью «Мне 40», он пропускает ее вместо того, чтобы помещать 40 в массив.

 Scanner inFile = null;
    File file = null;
    String filePath = (JOptionPane.showInputDialog("Please enter a file path"));
    int size = 0;
    int[] result = new int[10];


    try {
        file = new File(filePath);
        inFile = new Scanner(file);
        int skippedCounter = 0;

        for(int i = 0; inFile.hasNext(); i  ){
            if(inFile.hasNextInt())
                result[i] = inFile.nextInt();
            else{
                String strOut = "";
                String data = inFile.next();

                for(int j = 0; j <= data.length() - 1; j  ){
                    if(!Character.isLetter(data.charAt(j))){
                        strOut  = data.charAt(j);
                    }
                    else
                        skippedCounter  ;
                }
                result[i] = Integer.parseInt(strOut);
            }
        }
    }
  

Комментарии:

1. Вы пытались отладить свой код?

Ответ №1:

next() выдаст вам следующий токен, а не следующую строку. таким образом, переменная i может превышать десять. вы бы поняли это, если бы у вас не было пустого catch : что ваш массив выходит за пределы

решение:

не используйте результирующий массив, используйте список результатов и добавляйте в его конец всякий раз, когда у вас есть другой результат

примечание:

другое скрытое исключение, которое может возникнуть, — это сбой вашего parseInt из-за нечисловых данных. Так что не оборачивайте все в гигантскую попытку / catch, это просто усложняет отладку!

Комментарии:

1. Это сработало, но теперь у меня проблема, из-за которой, когда я печатаю свой arraylist в array, появляются пустые элементы, от которых я, похоже, не могу избавиться

Ответ №2:

Я предлагаю вам использовать функцию nextInt только один раз, чтобы сохранить запрошенное значение, а затем использовать эту переменную всякий раз, когда вам это нужно. Я думаю, что функция nextInt переходит к следующему int каждый раз, когда вы обращаетесь к ней.

Ответ №3:

Следующее

 result[i] = Integer.parseInt(strOut)
  

приведет к NumberFormatException при попытке обработать любую букву. Как strOut приводит к пустой строке ""

Вам придется проверить наличие пустой строки перед попыткой синтаксического анализа

 if (!strOut.isEmpty()) {
    result[i] = Integer.parseInt(strOut);
}