Błąd NullPointerException w aplikacji z filmami

0

robię Retrofita z wykorzystaniem RxJavy zgodnie z tym filmem i jak się pewnie domyślacie, nie działa mi XD
nie wiem co mogę zrobić, aby naprawić ten błąd, bo za każdym razem jak poprawiam jakiś, to w jego miejsce pojawiają się kolejne

jest to mój pierwszy jakikolwiek projekt w Javie, więc liczę na waszą wyrozumiałość :D

wiem, że metoda getMovie() jest pusta i chyba przez to wyrzuca ten błąd, no ale jednak w tym filmiku też ten typek nic nie wpisał w tej metodzie, a jednak mu działa XD

tutaj link do całości repo, bo GitHub odrzuca z powodu zbyt dużego rozmiaru pliku :/

stacktrace:

FATAL EXCEPTION: main
Process: com.example.mainactivity, PID: 6483
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mainactivity/com.example.mainactivity.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
  at android.os.Handler.dispatchMessage(Handler.java:106)
      at android.os.Looper.loopOnce(Looper.java:201)
      at android.os.Looper.loop(Looper.java:288)
      at android.app.ActivityThread.main(ActivityThread.java:7872)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
  Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
      at com.example.mainactivity.MainActivity.fetchData(MainActivity.java:53)
      at com.example.mainactivity.MainActivity.onCreate(MainActivity.java:49)
      at android.app.Activity.performCreate(Activity.java:8305)
      at android.app.Activity.performCreate(Activity.java:8284)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) 
      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 
      at android.os.Handler.dispatchMessage(Handler.java:106) 
      at android.os.Looper.loopOnce(Looper.java:201) 
      at android.os.Looper.loop(Looper.java:288) 
      at android.app.ActivityThread.main(ActivityThread.java:7872) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 
   

MyAPI.java:

import com.example.mainactivity.model.Movie;

import java.util.List;

import io.reactivex.rxjava3.core.Observable;
import retrofit2.http.GET;

public interface MyAPI {
    @GET("http://localhost:8080/api/v1/movies/")
    Observable<List<Movie>> getMovie();
}

MainActivity.java:

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import com.example.mainactivity.adapter.MovieAdapter;
import com.example.mainactivity.model.Movie;
import com.example.mainactivity.retrofit.MyAPI;
import com.example.mainactivity.retrofit.RetrofitClient;

import java.util.List;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.schedulers.Schedulers;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;


public class MainActivity extends AppCompatActivity {

    MyAPI myAPI;
    RecyclerView recycler_movie;
    CompositeDisposable compositeDisposable = new CompositeDisposable();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Init API
        //Retrofit retrofit = RetrofitClient.getInstance();
        //myAPI = retrofit.create(MyAPI.class);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://localhost:8080/api/v1/movies/")
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        //View
        recycler_movie = (RecyclerView)findViewById(R.id.recycler_movie);
        recycler_movie.setHasFixedSize(true);
        recycler_movie.setLayoutManager(new LinearLayoutManager(this));

        fetchData();
    }

    private void fetchData() {
        compositeDisposable.add(myAPI.getMovie()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<List<Movie>>() {
                    @Override
                    public void accept(List<Movie> movies) throws Throwable {
                        displayData(movies);
                    }
                }));
    }

    private void displayData(List<Movie> movies) {
        MovieAdapter adapter = new MovieAdapter(this, movies);
        recycler_movie.setAdapter(adapter);
    }

    @Override
    protected void onStop() {
        compositeDisposable.clear();
        super.onStop();
    }
}
0

Masz coś odpalone na http://localhost:8080? Pewnie nie i przez to leci NullPointerException

0

@Dregorio: no właśnie mam odpalone REST API IntelliJ. i nie mam pojęcia o co chodzi :/

0

To zrób na tym endpoincie curla/postman i zobacz co ci zwraca. Powinna to być tablica obiektów z polami jak w klasie MovieKliknij

Czemu to:

//Retrofit retrofit = RetrofitClient.getInstance();
        //myAPI = retrofit.create(MyAPI.class);

Masz zakomentowane?

0

@Dregorio: w sensie na localhoście? bo jeśli tak, to wszystko śmiga:

[
    {
        "id": 1,
        "type_movie": "Movie",
        "title": "Leon",
        "release_year": 1994,
        "genre": "Action",
        "director": "Luc Besson",
        "imdb_rating": 8.5,
        "storyline": "12-year-old Mathilda is reluctantly taken in by Leon, a professional assassin, after her family is murdered. An unusual relationship forms as she becomes his protegee and learns the assassin's trade."
    },
    {
        "id": 2,
        "type_movie": "Movie",
        "title": "Intouchables",
        "release_year": 2011,
        "genre": "Biography",
        "director": "Olivier Nakache",
        "imdb_rating": 8.5,
        "storyline": "After he becomes a quadriplegic from a paragliding accident, an aristocrat hires a young man from the projects to be his caregiver."
    }
]
0

@Dregorio: bo tak było w tym filmiku, ale nie zadziałało, bo wyrzuciło jakiś tam błąd, ale nie pamiętam już co, więc dodałem to:

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://localhost:8080/api/v1/movies/")
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
0

Wróć do poprzedniego i podeślij błąd

0
FATAL EXCEPTION: main
                                                                                                    Process: com.example.mainactivity, PID: 5053
                                                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mainactivity/com.example.mainactivity.MainActivity}: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.rxjava3.core.Observable<java.util.List<com.example.mainactivity.model.Movie>>
                                                                                                        for method MyAPI.getMovie
                                                                                                    	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645)
                                                                                                    	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
                                                                                                    	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
                                                                                                    	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                                                                                                    	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:201)
                                                                                                    	at android.os.Looper.loop(Looper.java:288)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:7872)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
                                                                                                    Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for io.reactivex.rxjava3.core.Observable<java.util.List<com.example.mainactivity.model.Movie>>
                                                                                                        for method MyAPI.getMovie
                                                                                                    	at retrofit2.Utils.methodError(Utils.java:53)
                                                                                                    	at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:105)
                                                                                                    	at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:66)
                                                                                                    	at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:37)
                                                                                                    	at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:192)
                                                                                                    	at retrofit2.Retrofit$1.invoke(Retrofit.java:149)
                                                                                                    	at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
                                                                                                    	at $Proxy2.getMovie(Unknown Source)
                                                                                                    	at com.example.mainactivity.MainActivity.fetchData(MainActivity.java:53)
                                                                                                    	at com.example.mainactivity.MainActivity.onCreate(MainActivity.java:49)
                                                                                                    	at android.app.Activity.performCreate(Activity.java:8305)
                                                                                                    	at android.app.Activity.performCreate(Activity.java:8284)
                                                                                                    	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
                                                                                                    	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
                                                                                                    	... 12 more
                                                                                                    Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for io.reactivex.rxjava3.core.Observable<java.util.List<com.example.mainactivity.model.Movie>>.
                                                                                                      Tried:
                                                                                                       * retrofit2.adapter.rxjava.RxJavaCallAdapterFactory
                                                                                                       * retrofit2.CompletableFutureCallAdapterFactory
                                                                                                       * retrofit2.DefaultCallAdapterFactory
                                                                                                    	at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:263)
                                                                                                    	at retrofit2.Retrofit.callAdapter(Retrofit.java:227)
                                                                                                    	at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:103)
                                                                                                    	... 24 more
0

Dobra już chyba wiem.

Mozesz wrócić tak jak było pierwotnie z dwiema zmianami.

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("localhost:8080")
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

I

@GET("/api/v1/movies/")

Jeśli to nieto to ja nie wiem. Na telefonie ciężko mi to czytać i rozkminiac, a kompa mi się nie chce włączyć XD

0

niestety nie pomogło :/

 Process: com.example.mainactivity, PID: 5368
  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mainactivity/com.example.mainactivity.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3645)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782)
      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
      at android.os.Handler.dispatchMessage(Handler.java:106)
      at android.os.Looper.loopOnce(Looper.java:201)
      at android.os.Looper.loop(Looper.java:288)
      at android.app.ActivityThread.main(ActivityThread.java:7872)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
  Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
      at com.example.mainactivity.MainActivity.fetchData(MainActivity.java:53)
      at com.example.mainactivity.MainActivity.onCreate(MainActivity.java:49)
      at android.app.Activity.performCreate(Activity.java:8305)
      at android.app.Activity.performCreate(Activity.java:8284)
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1417)
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3626)
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3782) 
      at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101) 
      at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
      at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307) 
      at android.os.Handler.dispatchMessage(Handler.java:106) 
      at android.os.Looper.loopOnce(Looper.java:201) 
      at android.os.Looper.loop(Looper.java:288) 
      at android.app.ActivityThread.main(ActivityThread.java:7872) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) 
3

jest null bo to jest zakomentowane - trzeba by to dodać po inicjalizacji pola retrofit

 //myAPI = retrofit.create(MyAPI.class);`
0

Kiepsko ogarniasz kodowanie a bierzesz sie za reaktywnosc? Zawróć przyjacielu ;)

0

@RequiredNickname: takie dostałem zadanie na studiach, więc nie licz, że zawrócę ;)

0

udało mi się naprawic wszystkie błędy poprzez:

  • zamianę 'com.squareup.retrofit2:adapter-rxjava:2.3.0'na 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' + co za tym idzie zamienie CallAdaptera z powodu zmiany zależności
  • dodanie w baseUrl http://localhost:8080/api/v1/ a przy metodzie interfejsu dajesz @GET("movies)

jednak teraz pojawił się jakiś błąd, który skutkuje tym, że nie mogę odpalić aplikacji XD

screenshot-20230106153410.png

0

To może zerknij w logi dlaczego się zepsuło? Tam serio jest sporo przydatnych informacji. Np. pytanie z którym przyszedłeś jest doskonale wyjaśnione w logu i wystarczyło go przeczytać:

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'io.reactivex.rxjava3.core.Observable com.example.mainactivity.retrofit.MyAPI.getMovie()' on a null object reference
      at com.example.mainactivity.MainActivity.fetchData(MainActivity.java:53)

Czyli "próbujesz wywołać metodę getMovie() na nullu" . Patrzysz w kod i widzisz coś takiego: compositeDisposable.add(myAPI.getMovie() i wiesz, że myAPI musi być w tym miejscu nullem. Patrzysz dalej i widzisz, że to pole nie jest nigdzie inicjalizowane, bo ktoś (kto to mógł być...) zakomentował inicjalizację klienta http.

Jeżeli uruchamiasz aplikację w Android Studio (zakładam, że go używasz), to tam jest zakładka ADT (jak nie pokręciłem skrótów) i aplikacja, albo system wypluły z siebie co je boli.

1 użytkowników online, w tym zalogowanych: 0, gości: 1