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

Codename One解析存储的JSON字符串时遇空指针异常求助

空指针异常原因分析与修复方案

你解析JSON时触发空指针异常,报错行System.out.println("No of Details: ---------> " + objMydetails.size());的问题根源是JSON结构与代码预期不匹配。

原JSON结构

你存储的JSON是一个单独的用户对象,不存在MemberDetails字段:

{"FirstName":"Festus","MiddleName":"Kilaka","LastName":"Mutinda","MemberNo":"1886","IdNumber":"3125638","PayRollNumber":"87","PhoneNumber":"254743901110","EmailAddress":"FESTUS@GMAIL.COM"}

问题分析

你的代码试图从解析后的map_saccos中获取MemberDetails对应的列表,但原JSON根本没有这个嵌套数组字段,导致map_saccos.get("MemberDetails")返回null。调用null对象的size()方法直接触发空指针异常。

修复后的代码

直接将解析结果当作单个用户对象处理,无需遍历列表:

private String str_response;       
private String memberNoLabel = ""; 
private String nameLabel = ""; 
private String idNoLbl = ""; 
private String staffNoLbl = ""; 
private String emailAddLbl = ""; 
private String PhoneNumber = "";
private String AccBalanceLable = "50,500";

str_response = (String) Storage.getInstance().readObject("profile.json");
Log.p("Reading profile.json from storage.", 1);

byte[] bytes_mydetails = str_response.getBytes();
JSONParser json_mysaccos = new JSONParser();
try (Reader is_mysaccos = new InputStreamReader(new ByteArrayInputStream(bytes_mydetails), "UTF-8")) 
{
    // 直接将解析结果视为单个用户的属性Map
    Map<String, Object> objDetails = json_mysaccos.parseJSON(is_mysaccos);
    
    // 提取字段值,可添加空值判断避免后续异常
    String name1 = objDetails.get("FirstName") != null ? (String)objDetails.get("FirstName") : "";
    String name2 = objDetails.get("MiddleName") != null ? (String)objDetails.get("MiddleName") : "";
    String name3 = objDetails.get("LastName") != null ? (String)objDetails.get("LastName") : "";
    nameLabel = name1 + " " + name2 + " " + name3; // 用空格分隔姓名更合理
    
    memberNoLabel = objDetails.get("MemberNo") != null ? (String)objDetails.get("MemberNo") : "";
    idNoLbl = objDetails.get("IdNumber") != null ? (String)objDetails.get("IdNumber") : "";
    staffNoLbl = objDetails.get("PayRollNumber") != null ? (String)objDetails.get("PayRollNumber") : "";
    PhoneNumber = objDetails.get("PhoneNumber") != null ? (String)objDetails.get("PhoneNumber") : "";
    emailAddLbl = objDetails.get("EmailAddress") != null ? (String)objDetails.get("EmailAddress") : "";
    
    System.out.println("解析完成,姓名:" + nameLabel);
}
catch (Exception e) 
{
    System.out.println("Error @ saccos: " + e);
    e.printStackTrace();
}

额外建议

  • 所有字段提取时添加空值判断,避免后续使用字符串时出现空指针;
  • 如果后续JSON结构调整为包含MemberDetails数组的形式,再改用原代码的列表遍历逻辑。

内容的提问来源于stack exchange,提问作者Festus Mutinda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:25:22