2017-02-21 5 views
0

Работает на Android-приложении, которое собирает данные из Open Weather API в качестве JSON. Однако JSON не всегда содержит одни и те же ключи (т. Е. Иногда включаются данные облака или описание погоды, иногда это не так).Допустимо ли исключать исключения, если не получить ожидаемые данные JSON?

Прямо сейчас мой код выглядит следующим образом (с некоторыми дополнительными геттерами/сеттерами я не причисляю):

public class WeatherDescrip { 

    private String weather; 
    private String weather_Desc; 
    private String icon; 

    public WeatherDescrip(JSONObject weatherObj) { 
     try { 
      weather = weatherObj.getString("main"); 
     } catch (JSONException e) { 
      weather = null; 
      e.printStackTrace(); 
     } 

     try { 
      weather_Desc = weatherObj.getString("description"); 
     } catch (JSONException e) { 
      weather_Desc = null; 
      e.printStackTrace(); 
     } 

     try { 
      icon = weatherObj.getString("icon"); 
     } catch (JSONException e) { 
      icon = null; 
      e.printStackTrace(); 
     } 
    } 

} 

В принципе, если JSON я получаю от вызова API не имеет необходимый ключ I пусть программа выдает исключение, которое обычно происходит с по меньшей мере одной частью данных каждый раз, когда приложение запускается (это делается больше).

Если кто-нибудь может сообщить мне, является ли это приемлемым способом кодирования, и, возможно, как лучше реализовать это, я бы очень его оценил.

Если вы еще не заметили, я тоже полный нуб, извините заранее, если это ужасный способ сделать это.

Большое спасибо

ответ

0

Это, как правило, не является подходящим форумом для спрашивать мнения, так как вы просите субъективные мнения, нет технически никакого способа измерить в «правильный» ответ, хотя вы вольны выбрать любой ответ, который вы выбираете , если таковые имеются ;-)

Но в характере доброй воли я дам вам несколько своих мнений.

Во-первых, Исключения для этого исключения. Если у вас есть сценарий, в котором вы контролируете код, и знаете, что существует вероятность того, что что-то не произойдет «идеальным» способом (например, вы получите изворотливые данные), тогда код для него, т. Е.

if (data.contains("somethingOfInterest")) { 
    consume(data); 
} else { 
    getDataFromSomewhereElse(); 
} 

Вместо того, чтобы исключать исключение и принудительно обрабатывать его в другом месте (или нет). Here's Дополнительная информация о том, почему не рекомендуется использовать исключения для потока управления.

Также, это советы личного опыта; в большинстве сценариев неплохо сделать так мало, что имеет смысл в конструкторе Object, так как более устрашающе восстанавливать, если исключения происходят внутри тела метода конструктора. Вместо этого может быть лучше инкапсулировать логику, которая у вас есть, в каком-либо другом классе или методе factory-esque, передавая только собранные данные конструктору. Что-то вроде:

public class WeatherDescrip { 
    private String weather; 
    private String weather_Desc; 
    private String icon; 

    public WeatherDescrip(String weather, String weather_Desc, String icon) { 
     this.weather = weather; 
     this.weather_Desc = weather_Desc; 
     this.icon = icon; 
    } 
} 

... 

public static WeatherDescrip createWeatherDescrip(JSONObject weatherObj) { 
    if (!weatherObj.containsKey("main") 
     || !weatherObj.containsKey("description") 
     || !weatherObj.containsKey("icon")) { 
     throw SomeNewMeaningfulException("That I understand and can explicitly handle"); 
     or.... 
     return getMyDataFromSomeWhereElse(); 
    } 

    return new WeatherDescrip(
     weatherObj.getString("main"), 
     weatherObj.getString("description"), 
     weatherObj.getString("icon") 
    ); 
} 

Надеюсь, это поможет.

0

Принято исключать исключения, если вы решите. Вам просто нужно играть, как вы хотите справиться с этим.

Допустимо ли сбой программы и загрузка вашего пользователя обратно на главный экран? Абсолютно нет. Ever

Просто прочитайте свои данные и обработайте исключения изящно - без значка? Отображение значения по умолчанию. Нет данных? Сообщите пользователю, что есть проблема прямо сейчас, поэтому они не вводятся в заблуждение старыми отображаемыми данными.

Альтернативный вариант, чтобы избежать большинства исключений, заключается в использовании GSON and Retrofit (я связал полезный набор учебников, а не дом GSON или дооснащение). С GSON вы можете создать объект модели, автоматически отображать данные, а затем на ваши добытчиках всегда возвращает значение, даже если JS была неполная

Пример:

class MyObj { 

    @SerializedName("main") 
    private String weather; 

    public String getWeather() { 
     String weatherResult = weather; 
     if (weatherResult == null || "".equals(weatherResult) { 
      weatherResult = getString(R.strings.weather_unavailable); 
     } 
     return weatherResult; 
    } 

} 
0

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

Реально, его можно использовать, когда захотите, но вы можете использовать has(), чтобы проверить, существует ли ключ до попытки доступа к нему. Это более эффективный способ достижения одного и того же результата без необходимости бросать или улавливать исключение.

if(weatherObj.has('description')) { 
    weather_Desc = weatherObj.getString("description"); 
} else { 
    weather_Desc = null; 
} 
Смежные вопросы