Сбой из-за Integer.parseInt - PullRequest
       23

Сбой из-за Integer.parseInt

8 голосов
/ 03 сентября 2011

Я пытаюсь импортировать текст из текстового файла, который был создан в другом Activity.Созданный текстовый файл состоит из String ArrayList, который содержит только цифры и другой случайный текст, сгенерированный Android.Когда я импортирую текст из файла, я использую BufferedReader и readLine(), чтобы получить каждый новый номер в Integer ArrayList.Я удаляю все нечисловые значения из текстового файла, а числа, сгенерированные в другом действии, разделяются символом "\ n".

Проблема, с которой я сталкиваюсь, заключается в том, что Android вылетаеткогда он загружает Activity.Я сузил причину до Integer.parseInt().

Мой код ниже:

ArrayList<Integer> lines = new ArrayList<Integer>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        File file = new File(getFilesDir(), "test_file.txt");

        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            while (br.readLine() != null) {
                String text = (br.readLine()).replaceAll("[^0-9]+","").trim();
                Integer number = Integer.parseInt(text);
                lines.add(number);
            }
        } catch (IOException e) {

        }

        TextView tv = (TextView) findViewById(R.id.helptext);

        int max = 0, min = 100;
        double total = 0;
        for (int i = 0; i < lines.size(); i++) {
            int number = lines.get(i);
            max = Math.max(max, number);
            min = Math.min(min, number);
            total += number;
        }

        tv.setText("max = " + max + " min = " + min + " total = "
                + total);

Ответы [ 4 ]

10 голосов
/ 03 сентября 2011

Проблемы:

  • Когда вы делаете replaceAll("[^0-9]+",""), вы можете получить пустую строку, заставляющую Integer.parseInt бросить NumberFormatException.

  • Вы пропускаете каждую вторую строку (ваше условие цикла while занимает первую строку, третью строку и т. Д.) *

    while (br.readLine() != null) // consumes one line
    

Попробуйте что-то вроде этого:

BufferedReader br = new BufferedReader(new FileReader(file));
String input;
while ((input = br.readLine()) != null) {
    String text = input.replaceAll("[^0-9]+","");
    if (!text.isEmpty())
        lines.add(Integer.parseInt(text));
}
3 голосов
/ 21 августа 2015

Все приведенные выше ответы верны, но они не помогут вам, если по каким-то причинам данные, поступающие к вам, не являются Integer. Например, сервер по ошибке отправил вам имя пользователя вместо userId (должно быть целым числом).

Это может произойти, поэтому мы всегда должны проверять, чтобы это предотвратить. В противном случае наше приложение упадет, и оно не будет приятным для пользователя. Поэтому при преобразовании String в Integer всегда используйте блок try-catch, чтобы предотвратить сбои приложения. Я использую следующий код для предотвращения сбоя приложения из-за анализа целых чисел -

try {
     Log.d(TAG, Integer.parseInt(string));
    } catch (NumberFormatException e) {
      Log.w(TAG, "Key entered isn't Integer");
    }
0 голосов
/ 03 сентября 2011

Убедитесь, что text - это только числа в строке, скорее всего, нет.Также вы можете попробовать:

Integer number = Integer.valueOf(text);

вместо:

Integer number = Integer.parseInt(text);

См .:

parseInt () возвращает примитивный целочисленный тип (int),посредством чего valueOf возвращает java.lang.Integer, который является объектом, представляющим целое число.Существуют обстоятельства, когда вам может понадобиться объект Integer вместо примитивного типа.

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

0 голосов
/ 03 сентября 2011

Если вы дадите числа в виде строки, такие как "1234" , это не даст никаких исключений или ошибок. Но вы дадите любой символ или специальный символ, тогда функция parse () выдаст исключение. Поэтому, пожалуйста, внимательно проверьте, должен ли проходить какой-то символ, чтобы он вызывал исключение и приводил к краху

...