Почему мне выдает Attempt to invoke virtual method com.example.cinema.responses.TVShowDetailsResponse.getTvShowDetails()' on a null object reference?

Четвертый день не могу понять почему мне пишет

Attempt to invoke virtual method com.example.cinema.responses.TVShowDetailsResponse.getTvShowDetails()' on a null object reference

если у меня вроде все правильно написано.

Помогите найти ошибку, пожалуйста. Через REST-API я вытягиваю список фильмов на сайте, после этого я хочу получить более детальную информацию про нужный мне фильм. Из списка фильмов нажимаю на любой фильм, и у меня вылетает.

Вот логи

    02-12 21:34:17.993 25684-25684/com.example.cinema E/RecyclerView: No adapter attached; skipping 
    layout
    02-12 21:34:17.996 25684-25684/com.example.cinema E/RecyclerView: No adapter attached; skipping 
    layout
    02-12 21:34:18.079 25684-25684/com.example.cinema E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.cinema, PID: 25684
    java.lang.NullPointerException: Attempt to invoke virtual method 
    'com.example.cinema.models.TVShowDetails 
    com.example.cinema.responses.TVShowDetailsResponse.getTvShowDetails()' on a null object reference
        at 
    com.example.cinema.DetailsActivity.lambda$getTVShowDetails$0$DetailsActivity(DetailsActivity.java:43)
        at com.example.cinema.-$$Lambda$DetailsActivity$GnroofsMecGfgW6cU0TaT06vJcI.onChanged(lambda)
        at androidx.lifecycle.LiveData.considerNotify(LiveData.java:131)
        at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:149)
        at androidx.lifecycle.LiveData.setValue(LiveData.java:307)
        at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:50)
        at com.example.cinema.repositories.TVShowDetailsRepository$1.onFailure (TVShowDetailsRepository.java:34)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onFailure$1$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:96)
        at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$G9BY9eQQk64nBfFjfIpx-YzJzUo.run(lambda)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:171)
        at android.app.ActivityThread.main(ActivityThread.java:5620)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)

Вот класс, который отвечает за вывод детальной информации

public class DetailsActivity extends AppCompatActivity {

private ActivityDetailsBinding activityDetailsBinding;
private TVShowDetailsViewModel tvShowDetailsViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    activityDetailsBinding = DataBindingUtil.setContentView(this,R.layout.activity_details);

    doInitialization();
}
private void doInitialization(){
    tvShowDetailsViewModel = new ViewModelProvider(this).get(TVShowDetailsViewModel.class);
    getTVShowDetails();
}

private void getTVShowDetails(){
    activityDetailsBinding.setIsLoading(true);

    String tvShowId = String.valueOf(getIntent().getIntExtra("id",-1));
    tvShowDetailsViewModel.getTvShowDetails(tvShowId).observe(
            this,tvShowDetailsResponse -> {
                activityDetailsBinding.setIsLoading(false);
                if (tvShowDetailsResponse.getTvShowDetails() != null){
                    if(tvShowDetailsResponse.getTvShowDetails().getPictures() != null){
                          loadImageSlider(tvShowDetailsResponse.getTvShowDetails().getPictures());
                    }
                }
            }
    ); 
}
private void loadImageSlider(String[] sliderImages){
    activityDetailsBinding.sliderViewPager2.setOffscreenPageLimit(1); //проверить
    activityDetailsBinding.sliderViewPager2.setAdapter(new ImageSliderAdapter(sliderImages));
    activityDetailsBinding.sliderViewPager2.setVisibility(View.VISIBLE);
    activityDetailsBinding.viewFadingEdge.setVisibility(View.VISIBLE);
}
}

Вот главный класс, с которого я посылаю Intent для определения id записи

public class MainActivity extends AppCompatActivity implements TVShowListener {
@Override
public void onTVShowClicked(TVShow tvShow) {
    Intent intent = new Intent(getApplicationContext(), DetailsActivity.class);
    intent.putExtra("id",tvShow.getId());
    intent.putExtra("name",tvShow.getName());
    intent.putExtra("startDate",tvShow.getStartDate());
    intent.putExtra("country", tvShow.getCountry());
    intent.putExtra("network",tvShow.getNetwork());
    intent.putExtra("status",tvShow.getStatus());
    startActivity(intent);
}
}

Вот класс Респонс

public class TVShowDetailsResponse {

@SerializedName("tvShow")
private TVShowDetails tvShowDetails;

public TVShowDetails getTvShowDetails() {
    return tvShowDetails;
}
}

Вот интерфейс Апи Сервис

public interface ApiService {
// https://www.episodate.com/api/most-popular?page=1
@GET("most-popular")
Call<TVShowsResponse> getMostPopular(@Query("page") int page);

// /api/show-details?q=:show
@GET("show-details")
Call<TVShowDetailsResponse> getTvShowDetails(@Query("q")String tvShowId);

}

Вот класс под ViewModel

public class TVShowDetailsViewModel extends ViewModel {
private TVShowDetailsRepository tvShowDetailsRepository;

public TVShowDetailsViewModel(){
   tvShowDetailsRepository = new TVShowDetailsRepository();
}

public LiveData<TVShowDetailsResponse> getTvShowDetails(String tvShowId) {
   return tvShowDetailsRepository.getTvShowDetails(tvShowId);
}
}

И вот класс под репозиторий

public class TVShowDetailsRepository {

private ApiService apiService;

public TVShowDetailsRepository (){
    apiService = ApiClient.getRetrofit().create(ApiService.class);
}

public LiveData<TVShowDetailsResponse> getTvShowDetails(String tvShowId){
    MutableLiveData<TVShowDetailsResponse> data = new MutableLiveData<>();
    apiService.getTvShowDetails(tvShowId).enqueue(new Callback<TVShowDetailsResponse>() {
        @Override
        public void onResponse(@NonNull Call<TVShowDetailsResponse> call, @NonNull Response<TVShowDetailsResponse> response) {
            data.setValue(response.body() );
        }

        @Override
        public void onFailure(@NonNull Call<TVShowDetailsResponse> call, @NonNull Throwable t) {
            data.setValue(null);
        }
    });

    return data;
}
}

Я уже столько раз изучал это все... Я не вижу тут ошибки, должно все правильно работать... Может, кто-то из опытных сможет помочь.


Ответы (0 шт):