Android Studio中Java应用出现NullPointerException错误求助
Android RecyclerView Adapter NullPointerException 排查与解决
问题场景
开发Java Android应用时,RecyclerView的TermAdapter抛出空指针异常,错误指向holder.termItemView.setText(name)语句,提示在空对象上调用setText方法。
错误日志
2022-08-04 21:01:08.374 9858-9858/com.erample.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.erample.myapplication, PID: 9858 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference at com.erample.myapplication.ui.TermAdapter.onBindViewHolder(TermAdapter.java:61) at com.erample.myapplication.ui.TermAdapter.onBindViewHolder(TermAdapter.java:18)
相关代码
TermAdapter 实现代码
public class TermAdapter extends RecyclerView.Adapter<TermAdapter.TermViewHolder> { class TermViewHolder extends RecyclerView.ViewHolder{ private final TextView termItemView; private TermViewHolder(View itemView){ super(itemView); termItemView=itemView.findViewById(R.id.term_detail_Term_Name); itemView.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { int position=getAdapterPosition(); final Terms current=mTerms.get(position); Intent intent=new Intent(context, CourseList.class); intent.putExtra("termID", current.getTermID()); intent.putExtra("termName", current.getTermName()); intent.putExtra("termYear", current.getTermYear()); intent.putExtra("termStartDate", current.getTermStartDate()); intent.putExtra("termEndDate", current.getTermEndDate()); context.startActivity(intent); } }); } } private List<Terms> mTerms; private final Context context; private final LayoutInflater mInflater; public TermAdapter(Context context){ mInflater=LayoutInflater.from(context); this.context=context; } @NonNull @Override public TermAdapter.TermViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView=mInflater.inflate(R.layout.term_list_item,parent, false); return new TermViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull TermAdapter.TermViewHolder holder, int position) { if(mTerms!=null){ Terms current=mTerms.get(position); String name= current.getTermName(); holder.termItemView.setText(name); } else { holder.termItemView.setText("No term name"); } } public void setTerms(List<Terms> terms){ mTerms=terms; notifyDataSetChanged(); } @Override public int getItemCount() { if(mTerms!=null){ return mTerms.size(); } else return 0; } }
提供的XML布局代码(非RecyclerView Item布局)
<LinearLayout android:id="@+id/termLinearLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toTopOf="parent"> <TextView android:id="@+id/term_detail_Term_Name" android:layout_width="225dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="@string/term_name" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/term_detail_Term_Year" android:layout_width="100dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="@string/term_year" android:textAlignment="textEnd" app:layout_constraintRight_toRightOf="@+id/term_detail_Term_Name" app:layout_constraintTop_toBottomOf="parent" /> </LinearLayout>
排查与解决
核心问题是termItemView为null,即findViewById(R.id.term_detail_Term_Name)未找到对应View,原因及解决步骤:
- 布局不匹配:Adapter中加载的是
R.layout.term_list_item,但你提供的XML代码是详情页布局(从term_detail_Term_Name的命名可判断),而非RecyclerView的Item布局。term_list_item.xml中大概率没有这个ID的TextView,导致查找失败。 - 解决步骤:
- 打开
res/layout/term_list_item.xml,检查其中是否存在ID为term_detail_Term_Name的TextView。 - 若Item布局里的TextView ID不同,将ViewHolder中的
findViewById参数改为Item布局中实际的ID。 - 若确认ID正确,执行
Build -> Clean Project后重新构建,避免R文件缓存问题。 - 检查是否存在多分辨率文件夹下的同名布局文件,确保所有布局中都包含目标TextView。
- 打开
内容的提问来源于stack exchange,提问作者edweird
相关产品推荐
相关产品推荐

