Почему Integer.parseInt создает исключение NumberFormatException при вводе, который кажется действительным? - PullRequest
3 голосов
/ 12 февраля 2010

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

Я проверил в окне просмотра, что входные данные функции parseInt действительно являются строкой, которая кажется действительным целым числом (например, «35»). Однако, когда я пытаюсь использовать функцию str.charAt в моей переменной str, содержащей значение «35», я получаю странные результаты:

str.charAt(0) == ""
str.charAt(1) == "3"
str.charAt(2) == ""
str.charAt(3) == "5"

Кажется, это проблема, возможно, как-то связанная с кодировкой, поэтому я попытался ее исправить, используя такой способ чтения файла:

InputStreamReader reader = new InputStreamReader(new FileInputStream(inputfile), "UTF-8");

(Я явно сохранил файл, используя кодировку UTF-8 в моем редакторе), но это не помогло. Есть идеи, в чем может быть проблема и как ее исправить?

РЕДАКТИРОВАТЬ: мой образец

        InputStreamReader reader = new InputStreamReader(new FileInputStream(inputfile), "UTF-8");
        BufferedReader bfreader = new BufferedReader(reader);

        line = bfreader.readLine();
        while (line !=null)
        {
                String[] valueStrings = line.split(" ");
                String hole = valueStrings[0]; 

                int[] values = new int[4];
                for (int i = 0; i <values.length; i++){

                    String nr = valueStrings[i+1].trim(); 
                    values [i] = Integer.parseInt(nr);
                }

                // it breaks at the parseInt here, the rest is not even executed...

         }

1 Ответ

11 голосов
/ 12 февраля 2010

Я предполагаю, что это на самом деле :

str.charAt(0) == '\0'
str.charAt(1) == '3'
str.charAt(2) == '\0'
str.charAt(3) == '5'

Звучит так, что, вероятно, он фактически сохранен в UTF-16, а не в UTF-8 - но если ваш текстовый редактор считает, что это означает для сохранения "нулевых" символов, это будет иметь смысл. Попробуйте посмотреть текстовый файл в двоичном шестнадцатеричном редакторе - я подозреваю, что вы обнаружите, что каждый второй байт равен 0.

Если это не поможет, пожалуйста, опубликуйте короткую, но полную программу, которая демонстрирует проблему - пока мы видели только одну строку вашего кода.

...