【问题标题】:java NullPointerException for GSONGSON 的 java NullPointerException
【发布时间】:2018-04-07 18:41:35
【问题描述】:

我在使用 GSON 库并尝试通过方法调用读取列表(或数组)以处理数据时遇到空指针异常-

从外部获取的 JSON 对象称为 Analytics(我稍后定义为一个类),并具有诸如制造商(一个字符串)和 usage_statistics(我在下面定义的一个类)之类的成员。分析(数据)看起来像

{
    "manufacturer": "Motorola",
    "market_name": "Moto G4 Play",
    "codename": "harpia",
    "model": "Moto G Play",
    "usage_statistics": {
        "session_infos": [{
            "building_id": 17,
            "purchases": [{
                "item_id": 9,
                "item_category_id": 9,
                "cost": 69.98
            }, {
                "item_id": 81,
                "item_category_id": 6,
                "cost": 113.81
            }]
        }, {
            "building_id": 18,
            "purchases": [{
                "item_id": 180,
                "item_category_id": 0,
                "cost": 42.98
            }]
        }, {
            "building_id": 16,
            "purchases": [{
                "item_id": 78,
                "item_category_id": 3,
                "cost": 30.78
            }, {
                "item_id": 30,
                "item_category_id": 0,
                "cost": 101.77
            }, {
                "item_id": 171,
                "item_category_id": 6,
                "cost": 46.61
            }]
        }]
    }
}

设计是

[usage_statistics 是一个类,其成员 session_infos 是 session_info 对象的列表。每个 session_info 对象由一个建筑物 ID 和一个购买类型的对象列表组成。每个购买对象都有一个 item_id、item_category_id 和 cost,都是字符串。]

最后一行出错的代码是

java.lang.reflect.Type collectionType = new TypeToken<List<analytics>>(){}.getType();
list_analytics lcs = new list_analytics();
List<analytics> analytics = new Gson().fromJson(inline, collectionType);
for(analytics E : analytics) {
    System.out.println(E.getManf());//displays "Motorola"
    System.out.println(E.getsis());
    session_info_arr = (E.getsis()).getsession_infos();
    //...
}

(我在 .getsession_infos() 部分遇到异常。我不确定为什么 .getsession_infos() 不提取列表。)

代码:

public class analytics {
    private String manufacturer;
    private usage_statistics usage_statistics;

    public String getManf() {
        return manufacturer;
    }

    public usage_statistics getsis() {
        return usage_statistics;
    }
}

public class usage_statistics {
    private List<session_info> session_info_arr;

    public List<session_info> getsession_infos() {
        List<session_info> arr = new ArrayList<session_info>(Collections.<session_info>emptyList());
        arr = session_info_arr;
        return arr;
    }
}

public class session_info {
    private int id;
    private List<purchase> purchase_arr;

    public int getbid() {
        return id;
    }

    public List<purchase> getPurchase() {
        List<purchase> arr = new ArrayList<purchase>();
        arr = purchase_arr;
        return purchase_arr;
    }
}

【问题讨论】:

  • 添加你的堆栈跟踪
  • @njzk2 如何获得完整的堆栈跟踪?我删除了“限制控制台输出”选项,但输出相同。
  • 你得到了什么输出?

标签: java nullpointerexception gson json-deserialization


【解决方案1】:

肯定需要查看堆栈跟踪才能提供更多帮助。

同时,我不确定你为什么在这里有括号:

session_info_arr = (E.getsis()).getsession_infos();

我认为你的意思是:

session_info_arr = E.getsis().getsession_infos();

另外,getsession_infos 的实施很差。正如所写,每次调用它都会创建并丢弃一个空的 ArrayList:

public List<session_info> getsession_infos()
{
    List<session_info> arr = new ArrayList<session_info>(Collections.<session_info>emptyList());
    arr = session_info_arr;
    return arr;
}

我想你的意思是这样的:

public List<session_info> getsession_infos() {
    return session_info_arr;
}

getPurchase 实现方式相同:

public List<purchase> getPurchase() {
    List<purchase> arr = new ArrayList<purchase>();
    arr = purchase_arr;
    return purchase_arr;
}

代替:

public List<purchase> getPurchase() {
    return purchase_arr;
}

【讨论】:

  • 我做了你的编辑,但没有帮助。如何获得完整的堆栈跟踪。我删除了“限制控制台输出”选项,但输出相同。
猜你喜欢
  • 2013-05-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多