0

在我的 Android 应用程序中,我正在尝试从 instagram 获取流行媒体,我正在使用本教程中显示的 JSONParser 类http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {}

    public JSONObject getJSONFromUrl(String url) {
      // Making HTTP request
      try {
          // defaultHttpClient
          DefaultHttpClient httpClient = new DefaultHttpClient();
          HttpGet httpPost = new HttpGet(url);

          HttpResponse httpResponse = httpClient.execute(httpPost);
          HttpEntity httpEntity = httpResponse.getEntity();
          is = httpEntity.getContent();          
      } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
              e.printStackTrace();
          } catch (IOException e) {
                e.printStackTrace();
            }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
              Log.e("Buffer Error", "Error converting result " + e.toString());
          }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
              Log.e("JSON Parser", "Error parsing data " + e.toString());
          }

        // return JSON String
        return jObj;
    }
}

这是我试图开始工作的代码:

private static  String urlInst = "https://api.instagram.com/v1/media/popular?client_id="+clientId;
public static  void Func() {
    JSONParser jParser = new JSONParser();
    JSONObject json = jParser.getJSONFromUrl(urlInst);
    try {
    JSONArray pics = json.getJSONArray("data");
        for (int i = 0; i < pics.length(); i++) { 
            JSONObject c=(JSONObject) pics.get(i);
            JSONObject user = c.getJSONObject("user");
            String name= user.getString("username");
            JSONObject img=c.getJSONObject("images");
            JSONObject thum=img.getJSONObject("thumbnail");
            String urlOfPic = thum.getString("url");                                  
        }
    } catch (JSONException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } 
}

但我收到错误:

缓冲区错误:转换结果时出错 java.lang.NullPointerException

JSON Parser 解析数据 org.json.JSONEXception 时出错:在字符 0 处输入结束

我想弄清楚是什么导致了这个错误,有什么想法吗?据我所见,错误就在这一行。

JSONObject json = jParser.getJSONFromUrl(urlInst);

但我是初学者,所以我不确定。帮助将不胜感激。

完整的错误日志:

09-08 16:49:22.343:E/Buffer 错误(9981):错误转换结果 java.lang.NullPointerException 09-08 16:49:22.343:E/JSON 解析器(9981):解析数据时出错 org.json.JSONException :09-08 16:49:22.351 字符 0 处的输入结束:E/AndroidRuntime(9981):致命异常:主要 09-08 16:49:22.351:E/AndroidRuntime(9981):java.lang.RuntimeException:无法启动活动 ComponentInfo{hr.zadatak.undabot.instag/hr.zadatak.undabot.instag.StartShowing}:java.lang.NullPointerException 09-08 16:49:22.351:E/AndroidRuntime(9981):在 android.app .ActivityThread.performLaunchActivity(ActivityThread.java:2663) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 09-08 16:49:22.351 : E/AndroidRuntime(9981): 在 android.app.ActivityThread.access$2300(ActivityThread.java:125) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 09-08 16:49:22.351: E/AndroidRuntime( 9981): 在 android.os.Handler.dispatchMessage(Handler.java:99) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.os.Looper.loop(Looper.java:123) 09 -08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.main(ActivityThread.java:4668) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 java.lang .reflect.Method.invokeNative(Native Method) 09-08 16:49:22.351: E/AndroidRuntime(9981): at java.lang.reflect.Method.invoke(Method.java:521) 09-08 16:49: 22.351: E/AndroidRuntime(9981): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 com.android .internal.os。ZygoteInit.main(ZygoteInit.java:636) 09-08 16:49:22.351: E/AndroidRuntime(9981): at dalvik.system.NativeStart.main(Native Method) 09-08 16:49:22.351: E/AndroidRuntime (9981): 引起: java.lang.NullPointerException 09-08 16:49:22.351: E/AndroidRuntime(9981): at hr.zadatak.undabot.instag.ListOfPhotos.LoadInstagramPictures(ListOfPhotos.java:51) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android .app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49 :22.351: E/AndroidRuntime(9981): ... 11 更多E/AndroidRuntime(9981): 在 dalvik.system.NativeStart.main(Native Method) 09-08 16:49:22.351: E/AndroidRuntime(9981): 引起: java.lang.NullPointerException 09-08 16:49: 22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.ListOfPhotos.LoadInstagramPictures(ListOfPhotos.java:51) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot .instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-08 16:49 :22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime(9981): ... 还有 11 个E/AndroidRuntime(9981): 在 dalvik.system.NativeStart.main(Native Method) 09-08 16:49:22.351: E/AndroidRuntime(9981): 引起: java.lang.NullPointerException 09-08 16:49: 22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.ListOfPhotos.LoadInstagramPictures(ListOfPhotos.java:51) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot .instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-08 16:49 :22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime(9981): ... 还有 11 个E/AndroidRuntime(9981):引起:java.lang.NullPointerException 09-08 16:49:22.351:E/AndroidRuntime(9981):在 hr.zadatak.undabot.instag.ListOfPhotos.LoadInstagramPictures(ListOfPhotos.java:51) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981) : 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime(9981): ... 11 更多E/AndroidRuntime(9981):引起:java.lang.NullPointerException 09-08 16:49:22.351:E/AndroidRuntime(9981):在 hr.zadatak.undabot.instag.ListOfPhotos.LoadInstagramPictures(ListOfPhotos.java:51) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981) : 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime(9981): ... 11 更多E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime (9981): ... 11 更多E/AndroidRuntime(9981): 在 hr.zadatak.undabot.instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1047) 09-08 16:49:22.351: E/AndroidRuntime(9981): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime (9981): ... 11 更多

4

3 回答 3

0

我认为 reader.readline() 返回 null 所以 'sb' 没有被填充。然后字符串'json'为空,'jObj'也为空,问题就出现了。请验证 reader.readline() 返回的内容是否不同于 null。

这发生在我编写提要阅读器(不知道为什么)时发生在我身上,但是通过这种其他方式它可以工作,所以你可能想尝试一下:

代替:

try {
     BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
     StringBuilder sb = new StringBuilder();
     String line = null;
     while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
     }
     is.close();
     json = sb.toString();
     ...

尝试这样做:

try {
     BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
     StringBuilder sb = new StringBuilder();
     String line = null;
     do {
        line = reader.readLine();
        if( line != null)
            sb.append(line + "\n");
     }while (line != null)
     is.close();
     json = sb.toString();
     ...
于 2013-10-09T20:01:55.870 回答
0

您的错误日志清楚地显示了正在发生的事情

Buffer Error: Error converting result java.lang.NullPointerException

这意味着该try块中的某些东西是null.

    BufferedReader reader = new BufferedReader(new InputStreamReader(
            is, "iso-8859-1"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    is.close();
    json = sb.toString(); 

我的猜测是is InputStream

is = httpEntity.getContent();          
于 2013-09-08T15:31:44.130 回答
-1

首先尝试更改此代码:

try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

进入这个:

try {
    BufferedReader r = new BufferedReader(new InputStreamReader(is));
    String x = "";
    x = r.readLine();
    String total = "";

    while(x!= null){
    total += x;
    x = r.readLine();
    }

    json = total;
    is.close();
} catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

并请从日志中添加完整错误。

于 2013-09-08T15:33:10.943 回答