Парсинг Double из CSV выдает RuntimeException - PullRequest
0 голосов
/ 21 сентября 2018

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

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.yogi.guestlogix/com.example.yogi.guestlogix.MainActivity}: java.lang.NumberFormatException: Invalid double: "EVE"
 Caused by: java.lang.NumberFormatException: Invalid double: "EVE"**

MainActivity.java

   //Airports data begin
        InputStream isss = getResources().openRawResource(R.raw.airports);
        BufferedReader readerss = new BufferedReader(
                new InputStreamReader(isss, Charset.forName("UTF-8"))
        );

        String liness = "";
//for airports.csv
        try {
            readerss.readLine();
            while ((liness = readerss.readLine()) != null) {
                //split by ',' first
                String[] airport = liness.split(",");

                //Read the data
                AirportsData airdata = new AirportsData();
                airdata.setAirportname(airport[0]);
                airdata.setAirportcity(airport[1]);
                airdata.setAirportcountry(airport[2]);
                airdata.setAirportIATAcode(airport[3]);
                //airdata.setAirportlang(Double.parseDouble(airport[4]));
                //airdata.setAirportlat(Double.parseDouble(airport[5]));
                AirportsDatas.add(airdata);
            }
        } catch (IOException e) {
            Log.wtf("My Activity", "Reading data file error " + liness, e);
            e.printStackTrace();
        }


        Log.d("Airline", "name is " + AirportsDatas);

airportData.java

public double getAirportlang(double airportlang) {
    return airportlang;
}


public void setAirportlang(double airportlang) {
    this.airportlang = airportlang;
}

public double getAirportlat( ) {
    return airportlat;
}

public void setAirportlat(double airportlat) {
    this.airportlat = airportlat;
}

@Override
public String toString() {
    return "AirportsData{" +
            "airportname='" + airportname + '\'' +
            ", airportcity='" + airportcity + '\'' +
            ", airportcountry='" + airportcountry + '\'' +
            ", airportIATAcode='" + airportIATAcode + '\'' +
            ", airportlang=" + airportlang +
            ", airportlat=" + airportlat +
            '}';
}

** Любое решение этой проблемы будет с благодарностью ....

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Проблема с файлами CSV заключается в том, что пользователи (и другие программисты) могут в значительной степени записать в файл то, что они хотят.

В вашем случае кто-то ввел не число в ячейку CSV, где выожидали double число с плавающей запятой.Java правильно жалуется, что это не может быть проанализировано до double.У вас есть два подхода к таким ситуациям:

A) Проектирование по контракту

Во-первых, вы можете решить эту проблему, полагаясь на проектирование по контракту .Вы можете использовать метод parseLat:

public Double parseLat(String[] csvRow) {
   final String lat= csvRow[4];
   assertIsNumeric(lat);
}

private void assertIsNumeric(String lat) {
    if(!isNumeric(lat)) {
        throw new IllegalArgumentException("Lattitude '" + lat + "' is not numeric");
    }
}

Существует бесчисленное множество вариантов реализации метода isNumeric, некоторые из которых обсуждаются здесь .Это все равно остановит выполнение, но даст более четкое сообщение пользователям.

B) Оборонительный дизайн

Второй вариант - предоставить parseLAttitudeметод, который заменяет не числовое значение на null:

public Double parseLattitude(String[] csvRow) {
    final String lattitude = csvRow[4];
    if(!isNumeric(lattitude)) {
        System.out.println("Could not parse lattitude '" + lat + "'");
        return null;
    }
   return Double.parseDouble(lat);
}
0 голосов
/ 21 сентября 2018

Я думаю, что проблема в том, что аэропорт [4] и аэропорт [5] могут быть не единственным и последним из аэропорта.Если эти поля содержат буквенные символы [az], вы получите исключение numberFormatException.Можете ли вы добавить вывод при печати в аэропорту, например:

System.out.println(Arrays.asList(airport));

к вопросу?Чем мы сможем вам лучше помочь

...