获取JSON时出现java空指针异常

获取JSON时出现java空指针异常,java,android,json,Java,Android,Json,这是我的代码,它在从url获取json时抛出java空指针异常。我在android清单中授予了internet权限,现在在新线程中获取url,因为它不允许在主线程中进行网络活动 package com.example.usa; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONO

这是我的代码,它在从url获取json时抛出java空指针异常。我在android清单中授予了internet权限,现在在新线程中获取url,因为它不允许在主线程中进行网络活动

 package com.example.usa;

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;

public class Home extends Activity {
    // url to make request
    private static String url = "http://api.androidhive.info/contacts/";

    // JSON Node names
    private static final String TAG_CONTACTS = "contacts";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_EMAIL = "email";
    private static final String TAG_ADDRESS = "address";
    private static final String TAG_GENDER = "gender";
    private static final String TAG_PHONE = "phone";
    private static final String TAG_PHONE_MOBILE = "mobile";
    private static final String TAG_PHONE_HOME = "home";
    private static final String TAG_PHONE_OFFICE = "office";


    JSONArray contacts = null;



    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
        final ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

        // Creating JSON Parser instance
        final JSONParser jParser = new JSONParser();
        final JSONObject json = null ;
        // getting JSON string from URL
        new Handler().postDelayed(new Runnable() {



            @Override
            public void run() {

                Thread thread = new Thread()
                {
                    @Override
                    public void run() {
                        try {
                            while(true) {
                                JSONObject json = jParser.getJSONFromUrl(url);
                                sleep(1000);

                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };

                thread.start();




                //
                finish();
            }
        }, 5000);






       // JSONObject json = jParser.getJSONFromUrl(url);









new Handler().postDelayed(new Runnable() {



            @Override
            public void run() {

                 try {
                        // Getting Array of Contacts
                        contacts = json.getJSONArray(TAG_CONTACTS);

                        // looping through All Contacts
                        for(int i = 0; i < contacts.length(); i++){
                            JSONObject c = contacts.getJSONObject(i);

                            // Storing each json item in variable
                            String id = c.getString(TAG_ID);
                            String name = c.getString(TAG_NAME);
                            String email = c.getString(TAG_EMAIL);
                            String address = c.getString(TAG_ADDRESS);
                            String gender = c.getString(TAG_GENDER);

                            // Phone number is agin JSON Object
                            JSONObject phone = c.getJSONObject(TAG_PHONE);
                            String mobile = phone.getString(TAG_PHONE_MOBILE);
                            String home = phone.getString(TAG_PHONE_HOME);
                            String office = phone.getString(TAG_PHONE_OFFICE);

                            /////////////////////////// 
                            Log.w("ID",id);
                            Log.w("Name",name);
                            Log.w("Email",email);
                            Log.w("Gender",gender);
                            Log.w("mobile",mobile);
                            Log.w("home",home);
                            Log.w("office",office);
                            Log.w("address",address);

                            ///////////////////
                            // creating new HashMap
                            HashMap<String, String> map = new HashMap<String, String>();

                            // adding each child node to HashMap key => value
                            map.put(TAG_ID, id);
                            map.put(TAG_NAME, name);
                            map.put(TAG_EMAIL, email);
                            map.put(TAG_PHONE_MOBILE, mobile);

                            // adding HashList to ArrayList
                            contactList.add(map);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                //
                finish();
            }
        }, 5000);



        // TODO Auto-generated method stub
    }

}
package com.example.usa;
导入java.util.ArrayList;
导入java.util.HashMap;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.os.Handler;
导入android.util.Log;
公营家庭推广活动{
//发出请求的url
专用静态字符串url=”http://api.androidhive.info/contacts/";
//JSON节点名称
专用静态最终字符串标记_CONTACTS=“CONTACTS”;
私有静态最终字符串标记\u ID=“ID”;
私有静态最终字符串标记_NAME=“NAME”;
私有静态最终字符串标记\u EMAIL=“EMAIL”;
私有静态最终字符串标记_ADDRESS=“ADDRESS”;
私有静态最终字符串标记_GENDER=“GENDER”;
专用静态最终字符串标记_PHONE=“PHONE”;
专用静态最终字符串标记\u PHONE\u MOBILE=“MOBILE”;
专用静态最终字符串标记\u PHONE\u HOME=“HOME”;
专用静态最终字符串标记\u PHONE\u OFFICE=“OFFICE”;
JSONArray联系人=null;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
最终ArrayList联系人列表=新ArrayList();
//创建JSON解析器实例
final-JSONParser-jParser=new-JSONParser();
最终JSONObject json=null;
//从URL获取JSON字符串
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
线程线程=新线程()
{
@凌驾
公开募捐{
试一试{
while(true){
JSONObject json=jParser.getJSONFromUrl(url);
睡眠(1000);
}
}捕捉(中断异常e){
e、 printStackTrace();
}
}
};
thread.start();
//
完成();
}
}, 5000);
//JSONObject json=jParser.getJSONFromUrl(url);
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
试一试{
//获取联系人数组
contacts=json.getJSONArray(TAG_contacts);
//通过所有触点循环
对于(int i=0;ivalue
地图放置(标签标识,标识);
地图放置(标签名称、名称);
地图放置(标签、电子邮件、电子邮件);
地图放置(标签、手机、手机);
//将哈希列表添加到ArrayList
联系人列表。添加(地图);
}
}捕获(JSONException e){
e、 printStackTrace();
}
//
完成();
}
}, 5000);
//TODO自动生成的方法存根
}
}
这是堆栈跟踪

10-04 06:39:24.830: D/dalvikvm(777): GC_FOR_ALLOC freed 15K, 4% free 4156K/4288K, paused 42ms, total 45ms
10-04 06:39:24.850: I/dalvikvm-heap(777): Grow heap (frag case) to 5.635MB for 1536016-byte allocation
10-04 06:39:25.040: D/dalvikvm(777): GC_FOR_ALLOC freed <1K, 3% free 5655K/5792K, paused 180ms, total 180ms
10-04 06:39:30.280: D/AndroidRuntime(777): Shutting down VM
10-04 06:39:30.280: W/dalvikvm(777): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
10-04 06:39:30.290: E/AndroidRuntime(777): FATAL EXCEPTION: main
10-04 06:39:30.290: E/AndroidRuntime(777): java.lang.NullPointerException
10-04 06:39:30.290: E/AndroidRuntime(777):  at com.example.usa.Home$2.run(Home.java:105)
10-04 06:39:30.290: E/AndroidRuntime(777):  at android.os.Handler.handleCallback(Handler.java:730)
10-04 06:39:30.290: E/AndroidRuntime(777):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-04 06:39:30.290: E/AndroidRuntime(777):  at android.os.Looper.loop(Looper.java:137)
10-04 06:39:30.290: E/AndroidRuntime(777):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-04 06:39:30.290: E/AndroidRuntime(777):  at java.lang.reflect.Method.invokeNative(Native Method)
10-04 06:39:30.290: E/AndroidRuntime(777):  at java.lang.reflect.Method.invoke(Method.java:525)
10-04 06:39:30.290: E/AndroidRuntime(777):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-04 06:39:30.290: E/AndroidRuntime(777):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-04 06:39:30.290: E/AndroidRuntime(777):  at dalvik.system.NativeStart.main(Native Method)
10-04 06:39:34.957: D/dalvikvm(777): GC_FOR_ALLOC freed 261K, 6% free 6445K/6824K, paused 81ms, total 98ms
10-04 06:40:00.868: D/dalvikvm(777): GC_FOR_ALLOC freed 2688K, 36% free 5075K/7880K, paused 39ms, total 43ms
10-04 06:44:25.888: I/Process(777): Sending signal. PID: 777 SIG: 9
10-04 06:39:24.830:D/dalvikvm(777):全部释放15K的GC,4%释放4156K/4288K,暂停42ms,总计45ms
10-04 06:39:24.850:I/dalvikvm堆(777):为1536016字节分配将堆(frag案例)增长到5.635MB
10-04 06:39:25.040:D/dalvikvm(777):你有这条线

JSONObject json = jParser.getJSONFromUrl(url);
但是您还有一个方法变量json,我想您打算稍后使用它。

问题是:

JSONObject json = jParser.getJSONFromUrl(url);
在第一个线程中,您将从URL检索数据并将其解析为json,在第一个线程之后不久,您将尝试从json对象中检索数据,该对象很可能没有任何数据,因为它仍然忙于检索数据。

所以这不是一个好主意<代码>从同一线程中的JSON数组中检索和获取数据。这将为您节省很多麻烦。

其次,将json解析数据存储在本地json ob中