使用接口时获取空值
Getting null when using interface
在我的项目中,我使用接口获取 Arraylist
的值。我已经为此编写了代码,但每当我的应用程序运行时,我都会得到 NullPointerException
。我也已经初始化了它
代码
public class MyResourceCustomAdaper extends BaseAdapter {
private Context context;
ArrayList<HashMap<String, String>> data;
static JSONObject jsonObject;
private static JSONObject NewDataSet;
private static ProgressDialog pDialog;
public static ArrayList<HashMap<String, String>> arrayMatchingJobs;
GetMatchingJobs matchingJobs;
GetMatchingJobsArray getMatchingJobsArray;
public MyResourceCustomAdaper(Context context, ArrayList<HashMap<String, String>> data) {
this.context = context;
this.data = data;
}
public static void setInterface(GetMatchingJobsArray getMatchingJobsArray) {
getMatchingJobsArray = getMatchingJobsArray;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
things done here....
return view;
}
public class GetMatchingJobs extends AsyncTask<String, String, String> {
String response;
Context c;
public GetMatchingJobs(Context c) {
this.c = c;
}
@Override
protected String doInBackground(String... strings) {
calling the web service
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
arrayMatchingJobs = new ArrayList<HashMap<String, String>>();
pasrsing the json and setting the value of arraylist in the interface
getMatchingJobsArray.getMatchingJobs(true, arrayMatchingJobs);//getting null here
}
}
Intent i = new Intent(c, MyResourceMatchingJobs.class);
c.startActivity(i);
}
}
}
}
public interface GetMatchingJobsArray {
public void getMatchingJobs(boolean value, ArrayList<HashMap<String, String>> arrayMatchingJobs);
}
}
Class 使用接口
public class MyResourceMatchingJobs extends Activity implements MyResourceCustomAdaper.GetMatchingJobsArray {
private ListView listView;
private MyResourceMatchingJobsCustomList adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_resource_matching_jobs_list);
listView = (ListView) findViewById(R.id.lv_my_resource_matching_jobs);
MyResourceCustomAdaper.setInterface(this);
}
@Override
public void getMatchingJobs(boolean value, ArrayList<HashMap<String, String>> arrayMatchingJobs) {
if (value) {
adapter = new MyResourceMatchingJobsCustomList(MyResourceMatchingJobs.this, arrayMatchingJobs);
listView.setAdapter(adapter);
}
}
}
LogCat
5338-5338/com.example.jobs_on_call.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.jobs_on_call_adapter.MyResourceCustomAdaper$GetMatchingJobs.onPostExecute(MyResourceCustomAdaper.java:253)
at com.example.jobs_on_call_adapter.MyResourceCustomAdaper$GetMatchingJobs.onPostExecute(MyResourceCustomAdaper.java:139)
at android.os.AsyncTask.finish(AsyncTask.java:602)
at android.os.AsyncTask.access0(AsyncTask.java:156)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4624)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
at dalvik.system.NativeStart.main(Native Method)
您的成员变量 getMatchingJobsArray 可能为空。如果是这种情况,您将在调用其 getMatchingJobs 方法时得到 NullPointerException。
这里:
public static void setInterface(GetMatchingJobsArray getMatchingJobsArray) {
getMatchingJobsArray = getMatchingJobsArray;
}
setInterface
方法是 static
但 getMatchingJobsArray
不是 static
.
关于静态方法:
在静态方法中只能访问静态字段
所以不用
getMatchingJobsArray = getMatchingJobsArray;
如果使用
MyResourceCustomAdaper.this.getMatchingJobsArray = getMatchingJobsArray;
然后代码编辑器将显示:
无法对非静态字段dfnsdks进行静态引用
Why getting NullPointerException?
因为class级对象getMatchingJobsArray
是null
。
要解决此问题,请将 getMatchingJobsArray
声明为 static
并使用 class 名称访问它:
static GetMatchingJobsArray getMatchingJobsArray;
public static void setInterface(GetMatchingJobsArray getMatchingJobsArray) {
MyResourceCustomAdaper.getMatchingJobsArray = getMatchingJobsArray;
}
或者在不使用静态方法和变量的情况下向 MyResourceCustomAdaper
class 构造函数添加一个参数:
public MyResourceCustomAdaper(Activity mActivity,Context context,
ArrayList<HashMap<String, String>> data) {
this.context = context;
this.data = data;
this.getMatchingJobsArray=(GetMatchingJobsArray)mActivity;
}
并从 Activity 通过将 Activity 上下文作为第一个参数传递来创建 MyResourceCustomAdaper
class 对象:
MyResourceCustomAdaper adapter=new MyResourceCustomAdaper(
MyResourceMatchingJobs.this,.....);
在我的项目中,我使用接口获取 Arraylist
的值。我已经为此编写了代码,但每当我的应用程序运行时,我都会得到 NullPointerException
。我也已经初始化了它
代码
public class MyResourceCustomAdaper extends BaseAdapter {
private Context context;
ArrayList<HashMap<String, String>> data;
static JSONObject jsonObject;
private static JSONObject NewDataSet;
private static ProgressDialog pDialog;
public static ArrayList<HashMap<String, String>> arrayMatchingJobs;
GetMatchingJobs matchingJobs;
GetMatchingJobsArray getMatchingJobsArray;
public MyResourceCustomAdaper(Context context, ArrayList<HashMap<String, String>> data) {
this.context = context;
this.data = data;
}
public static void setInterface(GetMatchingJobsArray getMatchingJobsArray) {
getMatchingJobsArray = getMatchingJobsArray;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(final int i, View view, ViewGroup viewGroup) {
things done here....
return view;
}
public class GetMatchingJobs extends AsyncTask<String, String, String> {
String response;
Context c;
public GetMatchingJobs(Context c) {
this.c = c;
}
@Override
protected String doInBackground(String... strings) {
calling the web service
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
arrayMatchingJobs = new ArrayList<HashMap<String, String>>();
pasrsing the json and setting the value of arraylist in the interface
getMatchingJobsArray.getMatchingJobs(true, arrayMatchingJobs);//getting null here
}
}
Intent i = new Intent(c, MyResourceMatchingJobs.class);
c.startActivity(i);
}
}
}
}
public interface GetMatchingJobsArray {
public void getMatchingJobs(boolean value, ArrayList<HashMap<String, String>> arrayMatchingJobs);
}
}
Class 使用接口
public class MyResourceMatchingJobs extends Activity implements MyResourceCustomAdaper.GetMatchingJobsArray {
private ListView listView;
private MyResourceMatchingJobsCustomList adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_resource_matching_jobs_list);
listView = (ListView) findViewById(R.id.lv_my_resource_matching_jobs);
MyResourceCustomAdaper.setInterface(this);
}
@Override
public void getMatchingJobs(boolean value, ArrayList<HashMap<String, String>> arrayMatchingJobs) {
if (value) {
adapter = new MyResourceMatchingJobsCustomList(MyResourceMatchingJobs.this, arrayMatchingJobs);
listView.setAdapter(adapter);
}
}
}
LogCat
5338-5338/com.example.jobs_on_call.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.jobs_on_call_adapter.MyResourceCustomAdaper$GetMatchingJobs.onPostExecute(MyResourceCustomAdaper.java:253)
at com.example.jobs_on_call_adapter.MyResourceCustomAdaper$GetMatchingJobs.onPostExecute(MyResourceCustomAdaper.java:139)
at android.os.AsyncTask.finish(AsyncTask.java:602)
at android.os.AsyncTask.access0(AsyncTask.java:156)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:4624)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
at dalvik.system.NativeStart.main(Native Method)
您的成员变量 getMatchingJobsArray 可能为空。如果是这种情况,您将在调用其 getMatchingJobs 方法时得到 NullPointerException。
这里:
public static void setInterface(GetMatchingJobsArray getMatchingJobsArray) {
getMatchingJobsArray = getMatchingJobsArray;
}
setInterface
方法是 static
但 getMatchingJobsArray
不是 static
.
关于静态方法:
在静态方法中只能访问静态字段
所以不用
getMatchingJobsArray = getMatchingJobsArray;
如果使用
MyResourceCustomAdaper.this.getMatchingJobsArray = getMatchingJobsArray;
然后代码编辑器将显示:
无法对非静态字段dfnsdks进行静态引用
Why getting NullPointerException?
因为class级对象getMatchingJobsArray
是null
。
要解决此问题,请将 getMatchingJobsArray
声明为 static
并使用 class 名称访问它:
static GetMatchingJobsArray getMatchingJobsArray;
public static void setInterface(GetMatchingJobsArray getMatchingJobsArray) {
MyResourceCustomAdaper.getMatchingJobsArray = getMatchingJobsArray;
}
或者在不使用静态方法和变量的情况下向 MyResourceCustomAdaper
class 构造函数添加一个参数:
public MyResourceCustomAdaper(Activity mActivity,Context context,
ArrayList<HashMap<String, String>> data) {
this.context = context;
this.data = data;
this.getMatchingJobsArray=(GetMatchingJobsArray)mActivity;
}
并从 Activity 通过将 Activity 上下文作为第一个参数传递来创建 MyResourceCustomAdaper
class 对象:
MyResourceCustomAdaper adapter=new MyResourceCustomAdaper(
MyResourceMatchingJobs.this,.....);