确认无异常时,如何移除try-catch块并使用JsonObject?
无需try-catch/throws使用JsonObject的推荐方案
既然你确认目标键必然存在、JSON格式绝对合法,完全可以通过以下几种方式简化代码:
1. 封装工具方法,隐藏异常处理逻辑
自己实现一个工具类,把原生JSONException包装成运行时异常抛出,业务代码里就不用显式处理了:
public class JsonUtils { public static JSONObject parseSafe(String jsonStr) { try { return new JSONObject(jsonStr); } catch (JSONException e) { throw new IllegalArgumentException("无效的JSON字符串", e); } } public static String getStringSafe(JSONObject json, String key) { try { return json.getString(key); } catch (JSONException e) { throw new NoSuchElementException("JSON中不存在指定键: " + key, e); } } }
之后业务代码就能写成你想要的简洁形式:
textViewOfcountryName.setText( JsonUtils.getStringSafe( JsonUtils.parseSafe("{\"EN\": \"Spain\", \"ES\": \"España\"}"), getString(R.string.iso_639) ) );
2. 用第三方JSON库替代原生org.json
原生org.json的方法都抛出受检异常,很多第三方库采用运行时异常设计,或者支持安全取值:
- Gson:可以直接解析为Map或自定义POJO,取值无需处理异常
// 解析为Map Map<String, String> countryMap = new Gson().fromJson("{\"EN\": \"Spain\", \"ES\": \"España\"}", new TypeToken<Map<String, String>>(){}.getType()); textViewOfcountryName.setText(countryMap.get(getString(R.string.iso_639)));
- Jackson:同样支持无异常的安全取值,或通过
ObjectMapper解析为Map/POJO
3. 断言(仅用于开发调试)
如果只是开发阶段快速验证,不想写try-catch,可以用断言,但注意发布版默认会关闭断言,不适合生产环境:
JSONObject json = new JSONObject("{\"EN\": \"Spain\", \"ES\": \"España\"}"); String value = null; try { value = json.getString(getString(R.string.iso_639)); } catch (JSONException e) { assert false : "JSON中未找到预期键: " + getString(R.string.iso_639); } textViewOfcountryName.setText(value);
额外提醒
哪怕当前场景数据绝对稳定,也建议:
- 若JSON来自外部渠道,最好保留兜底逻辑,避免后续数据变动导致崩溃
- 工具类方案是最平衡的选择,既简化业务代码,又保留异常信息便于调试
内容的提问来源于stack exchange,提问作者Taha Sami
相关产品推荐
相关产品推荐

