ParseInt вызывает исключение при чтении числового вывода StringBuffer - PullRequest
0 голосов
/ 09 августа 2011

Мое приложение считывает выходные данные программ командной строки, которые всегда являются цифрами 0-3. Данные начинаются как stringBuffer, отправляются .toString, и третий шаг - преобразовать их в целое число для сравнения. Последний шаг с использованием Integer.parseInt вызывает исключение java.lang.NumberFormatException. Например, если выходные данные программы командной строки равны «0», это исключение.

08-08 18:31:30.167: ERROR/AndroidRuntime(26484): FATAL EXCEPTION: main
08-08 18:31:30.167: ERROR/AndroidRuntime(26484): java.lang.NumberFormatException: unable to parse '0
08-08 18:31:30.167: ERROR/AndroidRuntime(26484): ' as integer
08-08 18:31:30.167: ERROR/AndroidRuntime(26484):     at java.lang.Integer.parse(Integer.java:433)

Обратите внимание на разрыв строки вокруг '0'. Я знаю, что преобразование может быть сложным, и я проверил кодировку и явно установил ее в UTF-8. Также я пытался проверить '\ n' или другие нечисловые символы с помощью этого кода перед преобразованием:

System.out.println(score);
    for(char c: score.toCharArray()){
        System.out.println(c);
    }

Этот код может недостаточно раскрыть ошибку. Однако если программу оставить без преобразования целых чисел, каждое отдельное числовое число будет напечатано как само по себе, и каждое многозначное число будет напечатано с цифрой в каждой строке без каких-либо посторонних символов.

Я вполне уверен, что я пытаюсь преобразовать соответствующие данные в дополнение к некоторым дополнительным невидимым символам.

  1. Как я могу понять, что это за невидимые символы?
  2. Каков наилучший способ избавиться от них и получить целочисленное представление только числового вывода подпроцесса?

Для справки: Код вызова подпроцесса:

try{    
        Process subProc = Runtime.getRuntime().exec("data/data/com.app/bin/prog /sdcard/file");

        BufferedReader reader = new BufferedReader(
                new InputStreamReader(subProc.getInputStream(), Charset.defaultCharset()), 10);
        int read;
        char[] buffer = new char[10];
        StringBuffer output = new StringBuffer();
        while ((read = reader.read(buffer)) > 0) {
            output.append(buffer, 0, read);
        }
        reader.close();
        subProc.waitFor();
        score = output.toString();


    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }


    System.out.println(score);
    for(char c: score.toCharArray()){
        System.out.println(c);
    }
    return score;

А для ударов, функция ParseInt, которая вызывает исключение:

int score = Integer.parseInt(NativeClass.getScore(file));

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 09 августа 2011
  1. Вы можете проверить числовое представление каждого символа, который вы пытаетесь проанализировать. Вы можете использовать static int Character.digit(char ch, int radix) метод. Все, что находится вне диапазона числового представления 0-9, является вашим "плохим" персонажем.
  2. String.replaceAll("[^0-9]+", "") удалит все не-цифры из вашего ввода, включая \n символы.
0 голосов
/ 09 августа 2011

Если «невидимые символы» являются пробелами, просто используйте метод String.trim(), чтобы избавиться от них.Если есть возможность ввода других символов, вам нужно использовать регулярные выражения для извлечения только чисел.

...