Java 为什么我用这段代码得到nullPointerException?
我有一个活动,在单击的方法的最后一行得到一个nullPointerExceptionJava 为什么我用这段代码得到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
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());
}