Парсинг Double из CSV выдает RuntimeException

Я пытаюсь прочитать данные из файла 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);

AirportsData.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 ответа

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

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

А) Дизайн по контракту

Во-первых, вы можете решить эту проблему, полагаясь на дизайн по контракту. Вы могли бы иметь 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 метод, некоторые обсуждаются здесь. Это все равно остановит выполнение, но даст пользователям более четкое сообщение.

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

Второй вариант, это предоставить 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);
}

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

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

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

Другие вопросы по тегам