为什么我用此代码得到nullPointerException?

时间:2019-02-10 20:59:31

标签: java android nullpointerexception

我有一个活动,并且在单击的方法的最后一行得到了nullPointerException

if not somevar == None

我删除了一些代码以使其简短,但问题是可以在onResponse方法中访问“ it”列表,但在clicked方法中给出了nullPointerException。

这是什么原因?如何存储要在onResponse方法之外使用的列表?

4 个答案:

答案 0 :(得分:1)

因为您尝试在初始化列表之前获取列表的大小。 在 Integer.toString(it.size());
因为它还没有初始化 getCompany(s);是异步方法 尝试删除Integer.toString(it.size());
因为不使用也不有用。   公共类MainActivity扩展了AppCompatActivity {

{{1}}

答案 1 :(得分:0)

clicked中,您呼叫getCompany并在其中设置设置了it的回调。问题是onResponse最有可能在此之后的某个时间被调用,而apiCall.setCallback将立即返回。因此,getCompany立即返回,并且当您尝试访问it时,null仍将是doResponse

在调用doResponse之后您想做什么,都应该在.ajaxStop()中启动。如何执行此操作取决于您的示例中不清楚的实际用例,但也许我的解释可以帮助您自己找到一些想法。如果不是,请在此处开始一个具有更多详细信息的新问题(新问题,因为它与NullPointerExceptions无关)。

答案 2 :(得分:0)

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

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());  
    }

答案 3 :(得分:0)

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

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

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

我希望这会有所帮助。不再挣扎;-)编码愉快!