为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我会在这段代码中得到 nullPointerException?

为什么我会在这段代码中得到 nullPointerException?

回首忆惘然 2022-06-15 14:39:01
我有一个活动,并且在单击方法的最后一行得到一个 nullPointerExceptionpublic class MainActivity extends AppCompatActivity {List<Item> it;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);       }    public void clicked(View view) {                  getCompany(s);        Integer.toString(it.size());      }    public void getCompany(String name) {        apiCall.setCallback(new ApiCall.NetworkCallback() {            @Override            public void onResponse(List<Item> items) {                 it = items;                for (int i = 0; i < items.size(); i++) {                        Log.d("Name", it.get(i).getTitle());                }            }        });    }我删除了一些代码以保持简短,但问题是在 onResponse 方法中可以访问“it”列表,但在 clicked 方法中给出了 nullPointerException。什么会导致这种情况以及如何存储要在 onResponse 方法之外使用的列表?
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

因为您尝试在初始化之前获取列表的大小。在 Integer.toString(it.size());

因为它还没有初始化 getCompany(s); 是异步方法尝试删除 Integer.toString(it.size());

因为在不使用和没有用处。公共类 MainActivity 扩展 AppCompatActivity {


List<Item> it;

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);   

}


public void clicked(View view) {          

    getCompany(s);

}


public void getCompany(String name) {


    apiCall.setCallback(new ApiCall.NetworkCallback() {

        @Override

        public void onResponse(List<Item> items) {

             it = items;

            for (int i = 0; i < items.size(); i++) {    

                Log.d("Name", it.get(i).getTitle());

            }

        }

    });

}


查看完整回答
反对 回复 2022-06-15
?
PIPIONE

TA贡献1829条经验 获得超9个赞

我会直接为您提供一个可能的解决方案,它为您提供一个界面的快速示例


public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);   

    }


    public void clicked(View view) {          

        getCompany(s, new OnReceiveCompany() {

            @Override

            public void onReceiveCompany(List<Item> it) {

                Integer.toString(it.size());                  

            }

        });

    }


    public void getCompany(String name, final OnReceiveCompany callback) {

        apiCall.setCallback(new ApiCall.NetworkCallback() {

            @Override

            public void onResponse(List<Item> items) {

                for (int i = 0; i < items.size(); i++) {    

                    Log.d("Name", it.get(i).getTitle());

                }

                // make sure this run on UI thread if you need to perform ui operation. You can wrap it with new Hanler(Looper.getMainLooper).post(...

                callback.onReceiveCompany(items);

            }

        });

    }


    interface OnReceiveCompany {

        void onReceiveCompany(List<Item> it);

    } 

}

为什么您的代码不起作用:


    public void clicked(View view) {

        // this method is gonna set "it" in the block of code in onResponse, which will happens after you call Integer.toString probably in a separate thread

        getCompany(s);

        Integer.toString(it.size());  

    }


查看完整回答
反对 回复 2022-06-15
?
交互式爱情

TA贡献1712条经验 获得超3个赞

当您尝试使用空变量(或尚未初始化的变量)时,会发生 NullPointerException。

即使onResponse()从内部调用clicked(),您也必须记住这onResponse是在异步调用中。这仅仅意味着不能保证在调用onResponse之前完成执行。clicked()

我建议添加Integer.toString(it.size())到您的onResponse()方法中。

我希望这有帮助。不要再挣扎了 ;-) 快乐的编码!


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信