Android开发:RecyclerView空对象引用错误排查求助
问题代码与错误信息
Home.class
public class Home extends AppCompatActivity { RecyclerView recyclerView; List<CarsModel> carsModels; private CarsAdapter carsAdapter; private RecyclerView cars_recyclerview; NotificationArray notificationArray; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); cars_recyclerview=(RecyclerView)findViewById(R.id.cars_recyclerview); carsModels = new ArrayList<>(); getCarsResponse(); } public void getCarsResponse(){ APIService service = ApiClient.getClient().create(APIService.class); Call<NotificationArray> call=service.getCarsJson(); call.enqueue(new Callback<NotificationArray>() { @Override public void onResponse(Call<NotificationArray> call, Response<NotificationArray> response) { NotificationArray notificationArray= response.body(); carsModels= new ArrayList<>(Arrays.asList(notificationArray.getList())); PutDataIntoRecyclerView(carsModels); Toast.makeText(Home.this,"Success",Toast.LENGTH_SHORT).show(); } @Override public void onFailure(Call<NotificationArray> call, Throwable t) { Toast.makeText(Home.this,"Failed",Toast.LENGTH_SHORT).show(); Log.e("failure",t.getLocalizedMessage()); } }); } private void PutDataIntoRecyclerView(List<CarsModel> carsModels) { CarsAdapter carsAdapter = new CarsAdapter( this, carsModels); cars_recyclerview.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(carsAdapter); } }
MainActivity.class
public class MainActivity extends AppCompatActivity { EditText username_et,password_et; SharedPreferences _objpref; private APIService service; Button btnLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnLogin=(Button)findViewById(R.id.btn_Login); username_et=(EditText) findViewById(R.id.username); password_et=(EditText)findViewById(R.id.password); btnLogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { CallLoginService(); } }); } private void CallLoginService() { try { final String username = username_et.getText().toString(); final String password = password_et.getText().toString(); APIService service = ApiClient.getClient().create(APIService.class); Call<ResponseBody> srvLogin = service.getToken( username, password); srvLogin.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { if (response.isSuccessful()) { try { String ResponseJson = response.body().string(); Gson objGson = new Gson(); tokenResponse objResp = objGson.fromJson(ResponseJson, tokenResponse.class); Toast.makeText(MainActivity.this, objResp.getAccess_token(), Toast.LENGTH_LONG).show(); Log.i(TAG,"MyClass.getView() — get item number " + objResp); Intent intent = new Intent(MainActivity.this, Home.class); startActivity(intent); } catch (Exception e) { e.printStackTrace(); Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show(); } } else { Toast.makeText(MainActivity.this, "ошибка", Toast.LENGTH_LONG).show(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Toast.makeText(MainActivity.this, "Ошибка" + t.getMessage(), Toast.LENGTH_LONG).show(); } }); } catch (Exception e) { e.printStackTrace(); } } }
Adapter.class
public class CarsAdapter extends RecyclerView.Adapter<CarsAdapter.ViewHolder> { private List<CarsModel> carsModels; private Context context; public CarsAdapter(Context context, List<CarsModel> carsModels) { this.carsModels=carsModels; this.context=context; } @NonNull @Override public CarsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cars_list_item,viewGroup,false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull CarsAdapter.ViewHolder viewHolder, int i) { viewHolder.car_name.setText(carsModels.get(i).getName()); viewHolder.car_desc.setText(carsModels.get(i).getDescription()); } @Override public int getItemCount() { return carsModels.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private TextView car_name,car_desc; public ViewHolder(@NonNull View itemView) { super(itemView); car_name=(TextView) itemView.findViewById(R.id.car_name); car_desc=(TextView)itemView.findViewById(R.id.car_desc); } } }
Model.class
public class CarsModel { @SerializedName("Id") @Expose private String Id; @SerializedName("Name") @Expose private String Name; @SerializedName("Description") @Expose private String Description; public String getId() { return Id; } public void setId(String Id) { this.Id = Id; } public String getName() { return Name; } public void setName(String Name) { this.Name = Name; } public String getDescription() { return Description; } public void getDescription(String Description) { this.Description = Description; } }
ModelArray.class
public class NotificationArray { private CarsModel[] list; public CarsModel[] getList() { return list; } public void setMoviz(CarsModel[] list) { this.list = list; } }
Interface.class
@GET("views/Notification") Call<NotificationArray>getCarsJson();
返回的JSON数据
{ "list":[ { "Id":2, "Name":"Система отопления", "Description":"Температура котла достигла максимального порога" }, { "Id":1, "Name":"Система отопления", "Description":"Температура котла достигла максимального порога" } ], "pageInfo":{ "totalRows":2, "page":1, "pageSize":25, "isFirstPage":true, "isLastPage":true } }
错误日志
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.tokenauth, PID: 8011 java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference at com.example.tokenauth.Home.PutDataIntoRecyclerView(Home.java:74) at com.example.tokenauth.Home.access$000(Home.java:25) at com.example.tokenauth.Home$1.onResponse(Home.java:56) at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68) at android.os.Handler.handleCallback(Handler.java:888) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:213) at android.app.ActivityThread.main(ActivityThread.java:8178) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1101)
错误分析
1. 直接崩溃原因
Home类的PutDataIntoRecyclerView方法中,你通过findViewById绑定了cars_recyclerview并设置了LayoutManager,但最后调用setAdapter时用了未初始化的recyclerView变量——这个变量从未关联布局中的控件,始终为空,触发空指针异常。
解决:将recyclerView.setAdapter(carsAdapter)替换为cars_recyclerview.setAdapter(carsAdapter),或者删除多余的recyclerView变量,统一使用cars_recyclerview。
2. 潜在问题修复
- Model类setter方法错误:
CarsModel中的getDescription(String Description)方法名错误,应改为setDescription(String Description),否则无法正确赋值描述字段,可能导致Adapter显示空内容。 - NotificationArray类setter命名错误:
setMoviz方法名与字段list不匹配,应改为setList,避免后续数据赋值或Gson解析异常。 - 空指针防护:在
onResponse中先判断response.body()是否为空,避免notificationArray.getList()触发空指针:if(response.body() != null){ NotificationArray notificationArray= response.body(); carsModels= new ArrayList<>(Arrays.asList(notificationArray.getList())); PutDataIntoRecyclerView(carsModels); Toast.makeText(Home.this,"Success",Toast.LENGTH_SHORT).show(); } else { Toast.makeText(Home.this,"数据为空",Toast.LENGTH_SHORT).show(); }
内容的提问来源于stack exchange,提问作者Argus Gale
相关产品推荐
相关产品推荐

