Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我用这段代码得到nullPointerException?_Java_Android_Nullpointerexception - Fatal编程技术网

Java 为什么我用这段代码得到nullPointerException?

Java 为什么我用这段代码得到nullPointerException?,java,android,nullpointerexception,Java,Android,Nullpointerexception,我有一个活动,在单击的方法的最后一行得到一个nullPointerException public class MainActivity extends AppCompatActivity { List<Item> it; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setConte

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

public 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());
                }
            }
        });
    }
public类MainActivity扩展了AppCompatActivity{
列出它;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
已单击公共作废(视图){
公司;
Integer.toString(it.size());
}
公共公司(字符串名称){
setCallback(新的apiCall.NetworkCallback(){
@凌驾
公共响应(列表项){
它=项目;
对于(inti=0;i
我删除了一些代码以保持简短,但问题是“it”列表在onResponse方法中是可访问的,但在clicked方法中给出了nullPointerException


造成这种情况的原因是什么?我如何存储要在onResponse方法之外使用的列表?

单击的
中,您调用
getCompany
,在
it
设置的位置设置回调。问题是
onResponse
很可能会在此后的一段时间调用
apiCall.setCallback
wi我会立即返回。因此,
getCompany
会立即返回,
it
在您尝试访问它时仍然是
null


在调用
doResponse
后,无论您想做什么,都应该在
doResponse
中启动。如何做取决于实际用例,您的示例并不清楚,但我的解释可能会帮助您对自己有一些想法。如果没有,请在这里开始一个新问题,并提供更多详细信息(新问题,因为它与NullPointerException无关)。

因为您试图在初始化列表之前获取列表的大小。 在里面 Integer.toString(it.size());
因为它还没有初始化 getCompany;是异步方法 尝试删除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());
            }
        }
    });
}
列出它;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
已单击公共作废(视图){
公司;
}
公共公司(字符串名称){
setCallback(新的apiCall.NetworkCallback(){
@凌驾
公共响应(列表项){
它=项目;
对于(inti=0;i
我将直接为您提供一个可能的解决方案,为您提供一个界面的快速示例

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

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

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

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


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

此外,当出现
异常时,始终包括堆栈跟踪并突出显示行导致异常。您可能想了解。@Carcigenicate,onResponse是在我得到异常之前从单击的内部调用的。kay感谢您的回答。我想我可以在onResponse中做我想做的事情,我只想先将列表存储在活动中是的,我知道它没有被使用,也没有用处。我想将列表存储在活动中y、 那一行只是为了看看列表是否存在,而它不存在。另外,我可以在问题行之前使用onResponse方法中的it列表。谢谢。界面似乎是解决我在android上遇到的许多问题的方法。我明天会尝试它。谢谢你的回复,但它对我没有帮助。我想将列表存储在我只是调用size方法来查看列表是否存在。
    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());  
    }