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
相关产品推荐
相关产品推荐

