java - NullPointerException:尝试在空对象引用上调用接口方法“int java.util.List.size()”
问题描述
我的代码有问题。实际上,这里是为玩家输入的名称。它使用引用类“nameListAdapter”的“玩家输入”类。这似乎是撒谎的错误,但不幸的是我没有看到问题
一切都奏效了。然后我尝试使用“可序列化”来做某事。那不起作用,当我回到原始代码时,它不再起作用了。
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Canvas;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.Toolbar;
import com.example.matthias.startanimation.spieler.Spieler;
import java.util.List;
public class Spielereingabe extends Activity {
List<Spieler> spielerList;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spielereingabe);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setActionBar(toolbar);
//Button
button = (Button) findViewById(R.id.zukategorieButton);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
openKategorien_n();
}
});
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showDialog();
}
});
RecyclerView recyclerView = findViewById(R.id.recycler_namensListe);
final NamensListeAdapter namensListeAdapter = new NamensListeAdapter(this, spielerList);
recyclerView.setLayoutManager(new LinearLayoutManager(Spielereingabe.this));
recyclerView.setAdapter(namensListeAdapter);
ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
namensListeAdapter.removeItem(viewHolder.getAdapterPosition());
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
// view the background view
}
};
// attaching the touch helper to recycler view
new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
}
//mathode für button
public void openKategorien_n() {
Intent intent = new Intent(this, Kategorien_n.class);
startActivity(intent);
}
//pop-up Dialog
private void showDialog() {
View ppview = LayoutInflater.from(getApplicationContext()).inflate(R.layout.popup_enter_name, null);
final EditText editText = ppview.findViewById(R.id.name_edit);
final RadioGroup radioGroup = ppview.findViewById(R.id.name_radiogroup);
final AlertDialog.Builder builder = new AlertDialog.Builder(Spielereingabe.this);
builder.setView(ppview)
.setTitle("Namen Eingeben")
.setPositiveButton("Speicher", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if (!editText.getText().toString().isEmpty())
spielerList.add(new Spieler()
.setName(editText.getText().toString())
.setGeschlecht(radioGroup.getCheckedRadioButtonId() == R.id.radio_male ? Gender.MALE : Gender.FEMALE));
Toast.makeText(Spielereingabe.this, editText.getText().toString() + " wurde hinzugefügt", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.cancel();
}
})
.show();
}
}
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.matthias.startanimation.spieler.Spieler;
import java.util.List;
public class NamensListeAdapter extends RecyclerView.Adapter<NamensListeAdapter.NameViewHolder> {
private List<Spieler> spielerList;
private LayoutInflater inflater;
public NamensListeAdapter(Context context, List<Spieler> namensList) {
this.spielerList = namensList;
this.inflater = LayoutInflater.from(context);
}
@Override
public NameViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new NameViewHolder(inflater.inflate(R.layout.name_recyclerview, parent, false));
}
@Override
public void onBindViewHolder(NameViewHolder holder, int position) {
Spieler spieler = spielerList.get(position);
String text = spieler.getName() + " (" + spieler.getGeschlecht().getCaption() + ")";
holder.textView_name.setText(text);
}
@Override
public int getItemCount() {
return spielerList.size();
}
public void removeItem(int itemIndex) {
spielerList.remove(itemIndex);
notifyItemRemoved(itemIndex);
}
public class NameViewHolder extends RecyclerView.ViewHolder {
TextView textView_name;
public NameViewHolder(View itemView) {
super(itemView);
textView_name = itemView.findViewById(R.id.nameview_text);
}
}
}
错误信息
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at com.example.matthias.startanimation.NamensListeAdapter.getItemCount(NamensListeAdapter.java:39)
看到任何人的错误?
解决方案
spielerList
尚未初始化。在Spielereingabe.java
类中初始化列表:
private final List<Spieler> spielerList = new Arraylist<>();
最好这样做,NamensListeAdapter.class
但在这种情况下它不会是一个final
变量。
推荐阅读
- arrays - 将 arg 输出文件作为 null 传递,如果在程序执行期间传递了值,则程序工作
- javascript - 在 Javascript 中的字符串中使用通配符
- numpy - 我的特征规范化是否正确(python 和 numpy)
- python - 使用 Python 从 hdf5 文件到 csv 文件
- ios - 强制更新/重置主屏幕小部件扩展配置
- ios - 致命错误:找不到模块“firebase_auth”@import firebase_auth
- python - PySimpleGui如何在画布中绘制而不出现在单独的窗口中
- generics - 如何将泛型类型转换为原始类型
- php - php dom 文档动态选择选项
- java - Gson 无法调用自定义序列化程序