为什么在此 activity 中出现空对象错误?
Why am getting null object error in this activity?
我正在使用改造来获取数据..我试图从小部件启动应用程序。但是应用程序由于空对象而崩溃。我尝试检查对象...从 API 获取数据后它不是空的,但后来它变成空的.. 为什么?有什么方法可以正确获取数据.. 应用程序如何在点击小部件后获取数据?
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.master_list);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//Checking to see if the app is opened by widget by checking existence of startFromWidget value from intent
if (getIntent().getExtras().getString("stringFromWidget") != null) {
//App opened by widget
fromWidget = true;
//Getting last stored value from Database assign it to temp
Cursor c = getContentResolver().query(DBContract.CONTENT_URI, null, null, null);
assert c != null;
c.moveToFirst();
String temp = c.getString(c.getColumnIndex(DBContract.RECIPE_NAME));
//Fetching data from API
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<List<ApiResponce>> call = apiService.getResponce();
call.enqueue(new Callback<List<ApiResponce>>() {
@Override
public void onResponse(Call<List<ApiResponce>> call, Response<List<ApiResponce>> response) {
reciepeObject = response.body().get(3);
//Making sure data is received
Toast.makeText(MasterListClass.this, reciepeObject.getName(), Toast.LENGTH_SHORT).show();//No null object error ...working fine
}
@Override
public void onFailure(Call<List<ApiResponce>> call, Throwable t) {
Log.e("networkError", t.getMessage());
}
});
}
//if the app not opened by widget get the object from the intent
else {
reciepeObject = getIntent().getParcelableExtra(getString(R.string.object));
}
//Null Object error from recipeObject.getName().. why ?
getSupportActionBar().setTitle(reciepeObject.getName());
Logcat:
05-11 12:42:48.558 6978-6978/facebooklogintest.cavepass.com.bakingapp E/AndroidRuntime:致命异常:main
进程:facebooklogintest.cavepass.com.bakingapp,PID:6978
java.lang.RuntimeException: 无法启动 activity ComponentInfo{facebooklogintest.cavepass.com.bakingapp/facebooklogintest.cavepass.com.bakingapp.UI.MasterListClass}: java.lang.NullPointerException: 尝试调用虚拟方法 'java.lang.String facebooklogintest.cavepass.com.bakingapp.ModelClasses.ApiResponce.getName()' 在空对象引用上
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
在 android.app.ActivityThread.-wrap11(未知 Source:0)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
在 android.os.Handler.dispatchMessage(Handler.java:105)
在 android.os.Looper.loop(Looper.java:164)
在 android.app.ActivityThread.main(ActivityThread.java:6541)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'java.lang.String facebooklogintest.cavepass.com.bakingapp.ModelClasses.ApiResponce.getName()'
在 facebooklogintest.cavepass.com.bakingapp.UI.MasterListClass.onCreate(MasterListClass.java:100)
在 android.app.Activity.performCreate(Activity.java:6975)
在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
在 android.app.ActivityThread.-wrap11(未知 Source:0)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
在 android.os.Handler.dispatchMessage(Handler.java:105)
在 android.os.Looper.loop(Looper.java:164)
在 android.app.ActivityThread.main(ActivityThread.java:6541)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
05-11 12:42:48.621 2661-6708/com.google.android.googlequicksearchbox:search E/ContentStoreEUAS: 未能提交延迟操作
05-11 12:42:49.066 2057-2086/system_process E/ActivityManager:applyOptionsLocked:未知动画类型=0
移动
getSupportActionBar().setTitle(reciepeObject.getName());
里面onResponse
call.enqueue(new Callback<List<ApiResponce>>() {
@Override
public void onResponse(Call<List<ApiResponce>> call, Response<List<ApiResponce>> response) {
reciepeObject = response.body().get(3);
getSupportActionBar().setTitle(reciepeObject.getName());
//^^^^^^^^^^^^
Toast.makeText(MasterListClass.this, reciepeObject.getName(), Toast.LENGTH_SHORT).show();//No null object error ...working fine
}
@Override
public void onFailure(Call<List<ApiResponce>> call, Throwable t) {
Log.e("networkError", t.getMessage());
}
});
因为 REST 调用是异步的,所以需要一些时间才能完成,响应只能在 onResponse
被触发后使用
我正在使用改造来获取数据..我试图从小部件启动应用程序。但是应用程序由于空对象而崩溃。我尝试检查对象...从 API 获取数据后它不是空的,但后来它变成空的.. 为什么?有什么方法可以正确获取数据.. 应用程序如何在点击小部件后获取数据?
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.master_list);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//Checking to see if the app is opened by widget by checking existence of startFromWidget value from intent
if (getIntent().getExtras().getString("stringFromWidget") != null) {
//App opened by widget
fromWidget = true;
//Getting last stored value from Database assign it to temp
Cursor c = getContentResolver().query(DBContract.CONTENT_URI, null, null, null);
assert c != null;
c.moveToFirst();
String temp = c.getString(c.getColumnIndex(DBContract.RECIPE_NAME));
//Fetching data from API
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<List<ApiResponce>> call = apiService.getResponce();
call.enqueue(new Callback<List<ApiResponce>>() {
@Override
public void onResponse(Call<List<ApiResponce>> call, Response<List<ApiResponce>> response) {
reciepeObject = response.body().get(3);
//Making sure data is received
Toast.makeText(MasterListClass.this, reciepeObject.getName(), Toast.LENGTH_SHORT).show();//No null object error ...working fine
}
@Override
public void onFailure(Call<List<ApiResponce>> call, Throwable t) {
Log.e("networkError", t.getMessage());
}
});
}
//if the app not opened by widget get the object from the intent
else {
reciepeObject = getIntent().getParcelableExtra(getString(R.string.object));
}
//Null Object error from recipeObject.getName().. why ?
getSupportActionBar().setTitle(reciepeObject.getName());
Logcat:
05-11 12:42:48.558 6978-6978/facebooklogintest.cavepass.com.bakingapp E/AndroidRuntime:致命异常:main 进程:facebooklogintest.cavepass.com.bakingapp,PID:6978 java.lang.RuntimeException: 无法启动 activity ComponentInfo{facebooklogintest.cavepass.com.bakingapp/facebooklogintest.cavepass.com.bakingapp.UI.MasterListClass}: java.lang.NullPointerException: 尝试调用虚拟方法 'java.lang.String facebooklogintest.cavepass.com.bakingapp.ModelClasses.ApiResponce.getName()' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 在 android.app.ActivityThread.-wrap11(未知 Source:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'java.lang.String facebooklogintest.cavepass.com.bakingapp.ModelClasses.ApiResponce.getName()' 在 facebooklogintest.cavepass.com.bakingapp.UI.MasterListClass.onCreate(MasterListClass.java:100) 在 android.app.Activity.performCreate(Activity.java:6975) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 在 android.app.ActivityThread.-wrap11(未知 Source:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6541) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 05-11 12:42:48.621 2661-6708/com.google.android.googlequicksearchbox:search E/ContentStoreEUAS: 未能提交延迟操作 05-11 12:42:49.066 2057-2086/system_process E/ActivityManager:applyOptionsLocked:未知动画类型=0
移动
getSupportActionBar().setTitle(reciepeObject.getName());
里面onResponse
call.enqueue(new Callback<List<ApiResponce>>() {
@Override
public void onResponse(Call<List<ApiResponce>> call, Response<List<ApiResponce>> response) {
reciepeObject = response.body().get(3);
getSupportActionBar().setTitle(reciepeObject.getName());
//^^^^^^^^^^^^
Toast.makeText(MasterListClass.this, reciepeObject.getName(), Toast.LENGTH_SHORT).show();//No null object error ...working fine
}
@Override
public void onFailure(Call<List<ApiResponce>> call, Throwable t) {
Log.e("networkError", t.getMessage());
}
});
因为 REST 调用是异步的,所以需要一些时间才能完成,响应只能在 onResponse
被触发后使用