Ява. Программа квадратичных формул с переменными a, b и c, считанная из файла. Неожиданная ошибка

Я делаю программу, которая читает из файла 3 числа, двойные или целые числа, в строке, кроме первой. Первая строка - это количество строк после. Три числа в каждой строке являются переменными a, b и c в квадратичной формуле. Затем программа должна вернуть разницу между + и - частью формулы. Вот пример того, что может содержать файл.

3
1 2 4
1.5 3.12 4.31
0.09 5 2

Моя проблема заключается в том, что при использовании сканера для преобразования токенов в файле в двойники, чтобы их можно было ввести в квадратичную формулу, я получаю следующую ошибку:

Exception in thread "main" java.lang.NumberFormatException: For input string: "­1"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1250)
    at java.lang.Double.parseDouble(Double.java:540)
    at gorf.main(gorf.java:23)

вот часть моего кода:

    int lines = Integer.parseInt(sc.nextLine());
    double a;
    double b;
    double c;

    String line = "";
    Scanner abc = new Scanner(line);
    for(int count = 0; count < lines; count++)
    {
        line = sc.nextLine();
        abc = new Scanner(line);

        a = Double.parseDouble(abc.next());
        b = Double.parseDouble(abc.next());
        c = Double.parseDouble(abc.next());
    }

person Dane Williams    schedule 06.12.2015    source источник
comment
Возможно ли, что ваш файл содержит некоторые специальные символы в начале, такие как BOM (знак порядка байтов)? Попробуйте кодировку типа UTF-8 без спецификации.   -  person Pshemo    schedule 06.12.2015
comment
Или неважно. Я неправильно прочитал ошибку (думал, что это было для синтаксического анализа "3", который был в начале вашего ввода).   -  person Pshemo    schedule 06.12.2015
comment
Разбор "1" как двойника не должен быть проблемой. Я думаю, что комментарий Пшемо все еще в некоторой степени актуален, поскольку там должен быть какой-то невидимый персонаж, который создает проблемы. Рассмотрите возможность присвоения результата Scanner.next() переменной перед синтаксическим анализом, а затем исследуйте каждый из символов по отдельности, чтобы выяснить, какой лишний символ прокрался туда.   -  person sstan    schedule 06.12.2015
comment
Попробовал присвоить его переменной, и он напечатал только "1" вот код, который я изменил. str = abc.next(); System.out.println(str); a = Double.parseDouble(str); Извините за форматирование, почему-то не могу заставить его работать. @sstan   -  person Dane Williams    schedule 06.12.2015
comment
Печать строки, если в ней есть невидимые символы, не поможет. Что вам нужно сделать, так это проверить длину строки с помощью strVar.length(), которая, как я предсказываю, вернет больше, чем 1. Затем вы можете изучить каждого из персонажей по отдельности, что-то вроде: (int)strVar.charAt(n).   -  person sstan    schedule 06.12.2015
comment
Это было правильно, он говорит, что его длина равна 2. Как я должен выяснить, что это за символ и как с ним обращаться, если я его не вижу? Это мой первый год, когда я изучаю информатику AP в старшей школе, поэтому я все еще новичок в этом. @sstan   -  person Dane Williams    schedule 06.12.2015
comment
Используйте небольшой фрагмент, который я вам дал: (int)strVar.charAt(n). Это даст вам значение кодовой точки Unicode для символа в позиции n, даже если сам символ не виден. Просто замените n на 0 и 1, чтобы прочитать оба значения кодовой точки Unicode.   -  person sstan    schedule 06.12.2015
comment
Да, значения Unicode похожи на ascii, по крайней мере, для меньших значений. В данном случае 173 — это мягкий дефис, а 49 — число 1. Мягкий дефис должен быть виден, но, по-видимому, этот символ вызывает проблемы и не всегда отображается правильно. В любом случае, вы хоть представляете, как этот персонаж попал в ваш файл? Вы использовали определенный редактор? Возможно, вы захотите убедиться, что вы используете редактор, который не портит ваш текст.   -  person sstan    schedule 06.12.2015


Ответы (1)


Ваш файл не чистый. У вас там скрыты невидимые символы.

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

int lines = Integer.parseInt(sc.nextLine());
double a;
double b;
double c;

String line = "";
Scanner abc = new Scanner(line);
for (int count = 0; count < lines; count++) {
    line = sc.nextLine();
    abc = new Scanner(line);

    a = Double.parseDouble(readNextAndLog(abc));
    b = Double.parseDouble(readNextAndLog(abc));
    c = Double.parseDouble(readNextAndLog(abc));
}

readNextAndLog метод:

private static String readNextAndLog(Scanner sc) {
    String s = sc.next();

    for (int i = 0; i < s.length(); i++) {
        System.out.println((int)s.charAt(i));
    }

    return s;
}

Обратите внимание на числа, напечатанные непосредственно перед возникновением исключения. Там будет напечатано значение Unicode проблемного символа.

Затем вам нужно будет выяснить, как неожиданное попало в ваш файл, и избавиться от него, или воссоздать файл с нуля.

ИЗМЕНИТЬ:

Ваш проблемный символ — это МЯГКИЙ ДЕФИС (U+00AD) .

Этот символ не должен быть невидимым, но известно, что он обрабатывается/отрисовывается непоследовательно. (Да, МЯГКИЙ ДЕФЕС — сложная задача)

Убедитесь, что ваш файл не содержит этого символа. Убедитесь, что вы используете редактор, который не испортит ваш файл каким-то неожиданным образом. Например, редактор, такой как Notepad++.

person sstan    schedule 06.12.2015