Android绘制JSON折线图出现NullPointerException,新手求助
解决你的Android折线图NPE及JSON解析问题
嘿,别慌,我帮你找到了两个核心问题,咱们一步步来搞定:
1. 解决AppController的NullPointerException
错误日志里明确指出AppController.getInstance()返回了null,这是因为你没有在AndroidManifest.xml中注册自定义的Application类——Volley的请求队列依赖这个类完成初始化,所以必须补上这一步:
打开你的AndroidManifest.xml,在<application>标签中添加android:name=".AppController",示例如下:
<application android:name=".AppController" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <!-- 你的Activity等原有内容 --> </application>
2. 修复JSON解析的逻辑错误
即使解决了NPE,你的JSON解析代码也会出错——循环遍历数组时,你错误地使用了外层的jsonObject,而没有去获取数组里的每个子对象。同时注意你的JSON中Estimate是浮点值(比如25.4),用getInt()会抛出类型转换异常,要改用getFloat()。
修改drawChart()方法里的循环部分:
错误代码:
for (int i = 0; i < jsonArray.length(); i++) { int Estimate = jsonObject.getInt("Estimate"); String Date = jsonObject.getString("Date"); x.add(new Entry(Estimate, i)); y.add(Date); }
替换为正确的解析逻辑:
for (int i = 0; i < jsonArray.length(); i++) { // 获取数组中的单个子对象 JSONObject coffeeItem = jsonArray.getJSONObject(i); // 从子对象中读取对应字段 float estimateValue = coffeeItem.getFloat("Estimate"); String timeStr = coffeeItem.getString("Date"); x.add(new Entry(estimateValue, i)); y.add(timeStr); }
3. 额外的小优化建议
- 确认你已经在
build.gradle(Module level)中添加了必要的依赖:
// Volley网络请求库 implementation 'com.android.volley:volley:1.2.1' // MPAndroidChart图表库 implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
- 你当前的RetryPolicy设置了超时为0,这会导致请求直接失败,建议改成合理配置:
strReq.setRetryPolicy(new DefaultRetryPolicy( 5000, // 超时时间5秒 DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT ));
完成这些修改后,重新运行App,应该就能正常加载JSON数据并绘制折线图了!
内容的提问来源于stack exchange,提问作者tsion
相关产品推荐
相关产品推荐

