Что мне не хватает?Ошибка NumberFormatException - PullRequest
3 голосов
/ 08 апреля 2019

Я хочу прочитать из текстового файла, который содержит только цифры. Такой файл есть в UTF-8, а числа разделяются только новыми строками (без пробелов и прочих вещей). Всякий раз, когда я вызываю Integer.valueOf (myString), я получаю исключение.

Это исключение действительно странно, потому что, если я создаю предопределенную строку, такую ​​как "56 \ n", и использую .trim (), она работает отлично. Но в моем коде, не только это не так, но тексты исключений говорят, что он не смог преобразовать это «54856». Я попытался ввести новую строку там, а затем текст ошибки говорит, что он не может конвертировать "54856 " С этим не может быть и речи, что мне не хватает?

File ficheroEntrada = new File("C:\\in.txt");
FileReader entrada =new FileReader(ficheroEntrada);
BufferedReader input = new BufferedReader(entrada);

String s = input.readLine();
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);

Текст исключения гласит:

Exception in thread "main" java.lang.NumberFormatException: For input string: "54856"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:658)
    at java.base/java.lang.Integer.valueOf(Integer.java:989)
    at Quicksort.main(Quicksort.java:170)

Файл в .txt состоит из:

54856
896
54
53
2
5634

Ответы [ 4 ]

2 голосов
/ 08 апреля 2019

Ну, по-видимому, это было связано с Windows и теми, которые он использует ... Я просто попытался выполнить его на виртуальной машине Linux, и это сработало.Спасибо всем, кто ответил !!

1 голос
/ 08 апреля 2019

Попробуйте прочитать файл с помощью Scanner. Класс использует метод hasNextInt(), чтобы определить, что вы читаете: Integer или нет.Это поможет вам выяснить, какая строка / символ вызывает проблему

public static void main(String[] args) throws Exception {
    File ficheroEntrada = new File(
            "C:\\in.txt");
    Scanner scan = new Scanner(ficheroEntrada);
    while (scan.hasNext()) {
        if (scan.hasNextInt()) {
            System.out.println("found integer" + scan.nextInt());
        } else {
            System.out.println("not integer" + scan.next());
        }
    }
}
0 голосов
/ 08 апреля 2019

Если вы хотите обеспечить синтаксический анализ строки, вы можете использовать Pattern и Regex, которые.

Pattern intPattern = Pattern.compile("\\-?\\d+");
Matcher matcher = intPattern.matcher(input);
if (matcher.find()) {
    int value = Integer.parseInt(matcher.group(0));
    // ... do something with the result.
} else {
    // ... handle unparsable line.
}

Этот шаблон допускает любые числа и, возможно, минус перед (без пробелов). Это должно обязательно разобрать, если это не слишком долго. Я не знаю, как он это обрабатывает, но ваш пример содержит в основном короткие целые числа, так что это не должно иметь значения.

0 голосов
/ 08 апреля 2019

Скорее всего, у вас есть leading/trailing whitespaces на входе, что-то вроде:

String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);

Используйте trim() в строке, чтобы избавиться от него.

UPDATE 2:

Если вашфайл содержит что-то вроде:

54856\n
896
54\n
53
2\n
5634

, затем используйте для него следующий код:

  ....your code
    FileReader enter = new FileReader(file);
    BufferedReader input = new BufferedReader(enter);
    String currentLine;
    while ((currentLine = input.readLine()) != null) {
    Integer in;
    //get rid of non-numbers
    in = Integer.valueOf(currentLine.replaceAll("\\D+",""));
    System.out.println(in);
    ...your code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...