【问题标题】:Why am getting null object error in this activity?为什么在此活动中出现空对象错误?
【发布时间】:2018-05-11 07:05:24
【问题描述】:

我正在使用改造来获取数据..我尝试从小部件启动应用程序。但是由于 null 对象,应用程序正在崩溃。我尝试检查对象...从 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:无法启动活动 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(未知来源: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(未知来源: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: Unknown animationType=0

【问题讨论】:

  • 请添加您的 logcat。我认为问题在于从捆绑数据中获取价值。在从bundle获取数据之前,首先通过getIntent().getExtras().hasString("key")方法检查key是否可用。

标签: android android-widget retrofit retrofit2 android-lifecycle


【解决方案1】:

移动

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 被触发后使用

【讨论】:

  • 如果需要一些时间,我应该如何处理数据......比如将数据添加到 recyclerView 等......?
  • 创建一个方法,在其中添加代码,在onResponse中调用该方法,如果需要传递参数
  • 很高兴能帮上忙,编码愉快
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2021-08-04
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多