You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:40:37