Double.valueOf () java.lang.NumberFormatException

Я столкнулся со следующей проблемой при попытке прочитать числа из файла csv. Цифры составлены правильно, десятичные точки тоже правильные (точки):

10;111.1;0.94
9.5;111.1;0.94
9;111.4;0.94
8.5;110.7;0.94

Я читаю файл построчно и разбиваю каждый из них на три токена, без пробелов и т. д. (Например, «10», «111,1», «0,94»). Несмотря на это, я получил исключение при вызове функции синтаксического анализа:

             Double pwr = Double.parseDouble(tokens[1]);
             Double control = Double.parseDouble(tokens[0]);

             Double cos = Double.parseDouble(tokens[2]);

java.lang.NumberFormatException: For input string: "10"

Когда я меняю порядок строк, например, 1 <--> 2, проблема сохраняется, но теперь у меня java.lang.NumberFormatException: For input string: "9.5" Что интересно, каждый раз, когда я делаю вышеуказанные вызовы с уровня отладчика, я получаю правильные значения без исключения. Похоже, проблема связана с первой строкой файла.

Вы хоть представляете, где находится источник проблемы?

Похоже, у вас есть какой-то невидимый символ в самом начале вашего файла.

Dawood ibn Kareem 13.04.2018 11:10

да, вы должны опубликовать свой массив чисел, как в коде

Marko Pacak 13.04.2018 11:11

Итерация по массиву символов токенов. Может быть, вы найдете неожиданного персонажа.

Flocke 13.04.2018 11:12

Вероятная проблема с кодировкой. Перед числами стоит невидимый символ. fileformat.info/info/unicode/char/200B/index.htm

Bejond 13.04.2018 11:17

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

Saif Ahmad 13.04.2018 11:20

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

Dawood ibn Kareem 13.04.2018 11:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
609
2

Ответы 2

Вероятно, это непечатаемый символ ASCII

Чтобы удалить это, вы можете просто использовать метод replaceAll, подобный этому, и использовать следующее регулярное выражение для удаления\\P{Print}

BufferedReader br = new BufferedReader(new FileReader(""));
String str=br.readLine();
str=str.replaceAll("\\P{Print}", "");

После запуска следующего регулярного выражения вы сможете проанализировать значение

================================================== =========================

Чтобы узнать, что это за персонаж, вы можете попробовать это.

1) Прочтите строку и распечатайте ее так, как она есть.

public class Test {
    public static void main(String[] args) {

        try {
            BufferedReader br = new BufferedReader(new FileReader("/path/to/some.csv"));
            String str=br.readLine();
            System.out.println(str);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ВЫХОД:

2) Теперь скопируйте вывод как есть и вставьте его в "" (двойные кавычки)

Как видите, теперь виден специальный символ.

[Решено] Предположительно проблема заключалась в каком-то «скрытом» символе нулевой длины в начале файла (кстати, спасибо за полезные предложения!). Я изменил кодировку файла на UTF-8 (Меню> Файл> Кодировка файла), и проблема была решена.

Другие вопросы по теме