You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

确认无异常时,如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:15:00