почему это дает мне java .util.InputMismatchException, когда я запускаю этот код, когда я использую текстовый файл с текстом (показан снизу) - PullRequest
1 голос
/ 20 февраля 2020
import java.util.*;

public void readToolData(String fileName) throws FileNotFoundException
{
    File dataFile = new File(fileName);
    Scanner scanner = new Scanner(dataFile);
    scanner.useDelimiter(",");

    while( scanner.hasNext() )
    {
        String toolName = scanner.next();
        String itemCode = scanner.next();
        int timesBorrowed = scanner.nextInt();
        boolean onLoan = scanner.nextBoolean();
        int cost = scanner.nextInt();
        int weight = scanner.nextInt();
        storeTool(new Tool(toolName, itemCode, timesBorrowed, onLoan, cost, weight));
    }

    scanner.close();
}

Файл:

Makita BHP452RFWX,RD2001, 12 ,false,14995,1800
Flex Impact Screwdriver FIS439,RD2834,14,true,13499,1200
DeWalt D23650-GB Circular Saw, RD6582,54,true,14997,5400
Milwaukee DD2-160XE Diamond Core Drill,RD4734,50,false,38894,9000
Bosch GSR10.8-Li Drill Driver,RD3021,25, true,9995,820
Bosch GSB19-2REA Percussion Drill,RD8654,85,false,19999,4567
Flex Impact Screwdriver FIS439, RD2835,14,false,13499,1200
DeWalt DW936 Circular Saw,RD4352,18,false,19999,3300
Sparky FK652 Wall Chaser,RD7625,15,false,29994,8400

Ответы [ 4 ]

0 голосов
/ 21 февраля 2020

Если вы читаете файл построчно, вы можете добавить дополнительные проверки, например, отфильтровать комментарии (в данном случае это строки, начинающиеся с «//»):

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main
{

    public static void readToolData(String fileName) throws FileNotFoundException
    {
        File dataFile = new File(fileName);
        Scanner scanner = new Scanner(dataFile);
        while (scanner.hasNext())
        {
            String line = scanner.nextLine().trim();
            if (line.isEmpty() || line.startsWith("//"))
            {
                // skip this line
                continue;
            }

            // Split the line
            String[] parts = line.split(" *, *");

            String toolName = parts[0];
            String itemCode = parts[1];
            int timesBorrowed = Integer.parseInt(parts[2]);
            boolean onLoan = Boolean.parseBoolean(parts[3]);
            int cost = Integer.parseInt(parts[4]);
            int weight = Integer.parseInt(parts[5]);

            System.out.println("toolName=" + toolName + ", weight=" + weight);
        }
        scanner.close();
    }

    public static void main(String[] args) throws FileNotFoundException
    {
        readToolData("/home/stefan/Programmierung/PC-Java/test/src/test.txt");
    }
}
0 голосов
/ 20 февраля 2020

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

scanner.useDelimiter("(\\s*,\\s*)|(\r\n)|(\n)");
0 голосов
/ 20 февраля 2020

Вы получаете InputMismatchException в int timesBorrowed = scanner.nextInt() для первой строки входного файла. Ошибка вызвана пробелами вокруг запятой.

Измените разделитель на *, *, тогда любое количество пробелов вокруг запятой станет частью разделителя и, следовательно, будет удалено. Вместо пробелов вы также можете использовать \\s, который охватывает все пробелы (пробелы и табуляции).

Затем вы снова получаете исключение в строке int weight = scanner.nextInt() для первой строки входного файла, поскольку 1800 сопровождается переводом строки. Итак, вам нужен разделитель, который также соответствует разрывам строк: ( *, *)|[\r\n]+

Регулярное выражение означает: либо запятую, окруженную любым количеством пробелов, либо хотя бы один последовательный разрыв строки. Обратите внимание, что в файлах Unix обычно есть только \n, а в файле Windows обычно оба символа \r\n в каждом переводе строки. Таким образом, это выражение охватывает оба формата файлов, а также пропускает пустые строки.

Вот полный пример, который работает:

public class Main
{

    public static void readToolData(String fileName) throws FileNotFoundException
    {
        File dataFile = new File(fileName);
        Scanner scanner = new Scanner(dataFile);
        scanner.useDelimiter("( *, *)|[\r\n]+");
        while (scanner.hasNext())
        {
            String toolName = scanner.next();
            String itemCode = scanner.next();
            int timesBorrowed = scanner.nextInt();
            boolean onLoan = scanner.nextBoolean();
            int cost = scanner.nextInt();
            int weight = scanner.nextInt();
            System.out.println("toolName=" + toolName + ", weight=" + weight);
        }
        scanner.close();
    }

    public static void main(String[] args) throws FileNotFoundException
    {
        readToolData("/home/stefan/Programmierung/PC-Java/test/src/test.txt");
    }
}
0 голосов
/ 20 февраля 2020

Проблема здесь в том, что ваши строки не заканчиваются запятой и есть новые строки.

Это то, что ваша программа интерпретирует первые две строки вашего ввода как:

Makita BHP452RFWX,RD2001, 12 ,false,14995,1800\nFlex Impact Screwdriver FIS439,RD2834,14,true,13499,1200

Обратите внимание, что после 1800 нет запятой? Существует \n, обозначающий символ новой строки.

Редактировать: я также замечаю пробелы после некоторых запятых, так что это, вероятно, тоже будет мешать. Попробуйте ответ Eng.Fouad, поскольку он решает мои проблемы.

...