Ошибка InputMismatchException со сканером Java при использовании Eclipse на Mac, но не на Win10 - PullRequest
1 голос
/ 09 марта 2019

У меня такое поведение, которое я не могу понять.Код прекрасно работает на Win10, но выдает ошибку InputMismatchException на MacOS.Он прерывается при попытке вызвать nextDouble () или nextInt ().

Вызов сделан из этого метода:

public void readVehicleData() 
{
    Frame frame = null;
    FileDialog fileBox = new FileDialog(frame, "Open", FileDialog.LOAD);
    fileBox.setDirectory(".");
    fileBox.setVisible(true);

    String fileName = fileBox.getDirectory()+fileBox.getFile(); 

    try
    {
        File dataFile = new File(fileName);  
        Scanner scanner = new Scanner(dataFile);

        while(scanner.hasNextLine())
        {
            String lineOfText = scanner.nextLine().trim(); 

            if (!lineOfText.startsWith("//") && !lineOfText.isEmpty() && !lineOfText.startsWith("["))
            {
                Scanner strScanner = new Scanner(lineOfText).useDelimiter("\\s*[,\n]\\s*");

                Vehicle vehicle = new Vehicle(); 

                if(strScanner.hasNext())
                {
                     vehicle.readData(strScanner);
                     vehicleList.add(vehicle);

                     strScanner.nextLine();
                }

                strScanner.close();  
            }                                
        }

        if(scanner.hasNextLine())
        {
            scanner.nextLine();
        }   

        scanner.close();
    }

    catch(FileNotFoundException ex)
    {
        System.err.println(ex.getMessage());
        System.err.println(ex.getCause());
        ex.printStackTrace();
        System.err.println("File " + fileName + " not found"); 
        fileName = null;
    }

Ошибка возникает при чтении «vehicle.readData (strScanner)", который выглядит так:

public void readData(Scanner strScanner) 
{
   group = strScanner.next();
   vehID = strScanner.next(); 
   regNo = strScanner.next();
   make = strScanner.next();    
   model = strScanner.next();    

   String strAirCon = strScanner.next();                          
   airCon = strAirCon.equalsIgnoreCase("Yes") == true ? true : false; 

   // It throws an InputMismatchException error here 
   engineSize = strScanner.nextDouble();   

   fuelType = strScanner.next(); 
   gearbox = strScanner.next();
   transmission = strScanner.next();

   // It also throws an InputMismatchException error here 
   // if the previous variables are commented
   mileage = strScanner.nextInt();


   dateFirstRegistered = strScanner.next();
}

Вот ошибки, которые я получаю:

Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at vehicleproject.Vehicle.readData(Vehicle.java:121)
at vehicleproject.ReservationSystem.readVehicleData(ReservationSystem.java:65)
at vehicleproject.Main.main(Main.java:10)

Я, очевидно, провел свое исследование, но не могу найти никакого решения для этого.Он работает без проблем на Win10, но не на MacOS.

Кто-нибудь сталкивался с подобной ошибкой в ​​MacOS?

Это пример данных, которые мне нужно прочитать:

[Данные автомобиля]

// данные - это группа, VehID, RegNo, марка, модель, AirCon или климат-контроль, размер двигателя (литры), тип топлива, коробка передач, трансмиссия, пробег, дата первой регистрации, тип кузова, количество дверей, количество мест

AA, TF-63403, MJ09TFE, Fiat, Panda Active Eco, № 1.1, неэтилированный, пятиступенчатая механическая коробка передач, FWD, 13584, 29-07-2009, хэтчбек, 5, 5 A, TF-61273, MJ09TFD, Fiat, Grande Punto Active, № 1.4, неэтилированный, пятиступенчатая механическая коробка передач, FWD, 14278, 12-05-2009, хэтчбек, 3, 5

Это один из классов:

import java.util.*;
import java.awt.*;
import java.io.*;

public class Vehicle
{
    private String group, vehID, regNo, make;
    private String model, fuelType, gearbox, transmission, dateFirstRegistered;
    private boolean airCon;
    private double engineSize;
    private int mileage;


    public Vehicle()
    {
        group = null;
        vehID = null;
        regNo = null;
        make = null;
        model = null;
        airCon = false;
        engineSize = 0.0;
        fuelType = null;
        gearbox = null;
        transmission = null;
        mileage = 0;
        dateFirstRegistered = null;      
    }

    public String getGroup()
    {
        return group;
    }

    public void setGroup(String newGroup)
    {
        group = newGroup;
    }

    public String getVehicleID()
    {
        return vehID;
    }

    public void setVehicleID(String newVehID)
    {
        vehID = newVehID;
    }

    public String getRegistrationNo()
    {
        return regNo;
    }

    public void setRegistrationNo(String newRegNo)
    {
        regNo = newRegNo;
    }

    public String getMake()
    {
        return make;
    }

    public void setMake(String newMake)
    {
        make = newMake;
    }

    public String getModel()
    {
        return model;
    }

    public void setModel(String newModel)
    {
        model = newModel;
    }

    public boolean getAirCon()
    {
        return airCon;
    }

    private String checkAirCon()
    {
        String output;              
        return output = getAirCon() == true ? "Yes" : "No";
    }

    public void printDetails()
    {
        System.out.println(make + " " + model + "  Group: " + group + "  Vehicle Id: " + vehID);
        System.out.println("Air conditioning / Climate control: " + checkAirCon());
        System.out.println("Engine Size: " + engineSize + "    Fuel: " + fuelType);
        System.out.println("Gearbox: " + gearbox + "  Transmission: " + transmission);
        System.out.println("Mileage: " + mileage + "  Date first registered: " + dateFirstRegistered);
        System.out.println();
    }

    public void readData(Scanner strScanner) 
    {
       group = strScanner.next();
       vehID = strScanner.next(); 
       regNo = strScanner.next();
       make = strScanner.next();    
       model = strScanner.next();    
       //System.out.println(model); 

       String strAirCon = strScanner.next();                          
       airCon = strAirCon.equalsIgnoreCase("Yes") == true ? true : false; 

       engineSize = strScanner.nextDouble();
       //System.out.println(engineSize);    

       fuelType = strScanner.next(); 
       gearbox = strScanner.next();
       transmission = strScanner.next();

       mileage = strScanner.nextInt();
       //System.out.println(mileage); 

       dateFirstRegistered = strScanner.next();
    }
}
...