java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.util.Iterator java.util.ArrayList.iterator”

问题描述

我是android的新手,我试图制作一个包含音乐的列表视图。该应用程序是完美构建的,但是当我尝试在设备上运行它时会崩溃,我尝试调试该应用程序并对其进行调试给了我上面的错误。这是我的以下代码。

FragmentHome.java

package lrandomdev.com.online.mp3player.fragments;

import......;

public class FragmentHome extends FragmentParent {



    private FragmentHome.OnFragmentInteractionListener mListener;

    RecyclerView rcTopAlbums,rcTopArtists,rcNewReleases,rcNewPlaylists,rcCategories;
    Button btnMoreAlbums,btnMoreArtists,btnMoreNew,btnMoreNewPlaylists,btnMoreCategory;
    AdapterAlbum adapterAlbum;
    AdapterArtist adapterArtist;
    AdapterPlaylist adapterPlaylist;
    AdapterTrack adapterTrack;
    AdapterCategories adapterCategories;

    ArrayList<Album> albums = new ArrayList<>();
    ArrayList<Artist> artists = new ArrayList<>();
    ArrayList<Playlist> playlists = new ArrayList<>();
    ArrayList<Track> tracks = new ArrayList<>();
    ArrayList<Categories> categories = new ArrayList<>();

    ApiServices apiServices;
    SliderLayout sliderLayout;

    public static final FragmentHome newInstance() {
        FragmentHome fragment = new FragmentHome();
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        apiServices=RestClient.getApiService();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_home,container,false);
        rcTopAlbums= (RecyclerView) view.findViewById(R.id.rcTracks);
        rcTopArtists=(RecyclerView)view.findViewById(R.id.rcTopArtist);
        rcNewReleases=(RecyclerView)view.findViewById(R.id.rcNewReleases);
        rcNewPlaylists=(RecyclerView)view.findViewById(R.id.rcNewPlaylists);
        rcCategories=(RecyclerView)view.findViewById(R.id.rcCategory);

        btnMoreAlbums=(Button) view.findViewById(R.id.btnMoreAlbums);
        btnMoreArtists=(Button) view.findViewById(R.id.btnMoreArtists);
        btnMoreNew=(Button) view.findViewById(R.id.btnMoreNew);
        btnMoreNewPlaylists=(Button) view.findViewById(R.id.btnMoreNewPlaylists);
        btnMoreCategory = (Button) view.findViewById(R.id.btnMoreCategory);

        btnMoreAlbums.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.goToAlbum(null);
            }
        });

        btnMoreArtists.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             mListener.goToArtist(null);
            }
        });

        btnMoreNewPlaylists.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.goToPlaylist(null);
            }
        });

        btnMoreCategory.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.goToCategory();
            }
        });

        btnMoreNew.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.goToTrack(null,false);
            }
        });




        loadAlbums();

        loadArtists();

        loadPlaylist();

        loadTrack();

        loadCategory();

        LinearLayout adView = (LinearLayout)view.findViewById(R.id.adView);
        Helpers.loadAd(getActivity(),adView);

        return view;
    }

    void loadAlbums(){
        albums.clear();
        adapterAlbum=new AdapterAlbum(getActivity(),albums,R.layout.row_home_album_item_grid);
        rcTopAlbums.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL,false));
        rcTopAlbums.setHasFixedSize(true);
        rcTopAlbums.setAdapter(adapterAlbum);
        Call<ArrayList<Album>> call= apiServices.getAlbums(0,10,null);
        call.enqueue(new Callback<ArrayList<Album>>() {
            @Override
            public void onResponse(Call<ArrayList<Album>> call,Response<ArrayList<Album>> response) {
                for (Album album:response.body()
                        ) {
                    albums.add(album);
                }
                adapterAlbum.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<ArrayList<Album>> call,Throwable t) {
            }
        });
        adapterAlbum.setOnItemClickListener(new AdapterAlbum.OnItemClickListener() {
            @Override
            public void onItemClick(View view,int position) {
                mListener.goToTrackInAlbum(albums.get(position).getId(),true);
            }
        });
    }

    void loadArtists(){
        artists.clear();
        adapterArtist=new AdapterArtist(getActivity(),artists,R.layout.row_home_artist_item);
        rcTopArtists.setLayoutManager(new LinearLayoutManager(getActivity(),false));
        rcTopArtists.setHasFixedSize(true);
        rcTopArtists.setAdapter(adapterArtist);
        Call<ArrayList<Artist>> call= apiServices.getArtists(0,null);
        call.enqueue(new Callback<ArrayList<Artist>>() {
            @Override
            public void onResponse(Call<ArrayList<Artist>> call,Response<ArrayList<Artist>> response) {
                for (Artist artist:response.body()
                        ) {
                    artists.add(artist);
                }
                adapterArtist.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<ArrayList<Artist>> call,Throwable t) {

            }
        });
        adapterArtist.setOnItemClickListener(new AdapterArtist.OnItemClickListener() {
            @Override
            public void onItemClick(View view,int position) {
               mListener.goToTrackInArtist(artists.get(position).getId(),true);
            }
        });
    }

    void loadPlaylist(){
        playlists.clear();
       adapterPlaylist = new AdapterPlaylist(getActivity(),playlists,R.layout.row_home_playlist_item_grid);
        rcNewPlaylists.setLayoutManager(new LinearLayoutManager(getActivity(),false));
        rcNewPlaylists.setHasFixedSize(true);
        rcNewPlaylists.setAdapter(adapterPlaylist);
        Call<ArrayList<Playlist>> call= apiServices.getPlaylists(0,null);
        call.enqueue(new Callback<ArrayList<Playlist>>() {
            @Override
            public void onResponse(Call<ArrayList<Playlist>> call,Response<ArrayList<Playlist>> response) {
                for (Playlist playlist:response.body()
                        ) {
                    playlists.add(playlist);
                }
                adapterArtist.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<ArrayList<Playlist>> call,Throwable t) {
            }
        });
        adapterPlaylist.setOnItemClickListener(new AdapterPlaylist.OnItemClickListener() {
            @Override
            public void onItemClick(View view,int position) {
                mListener.goToTrackInPlaylist((int)playlists.get(position).getId(),true);
            }
        });
    }

    LinearLayoutManager myLinearLayoutManager  = new LinearLayoutManager(getActivity()){
        @Override
        public boolean canScrollVertically() {
            return false;
        }
    };


    void loadTrack(){
        tracks.clear();
        adapterTrack = new AdapterTrack(getActivity(),tracks,R.layout.row_track_item);
        rcNewReleases.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false){
            @Override
            public boolean canScrollVertically() {
                return false;
            }
        });
        rcNewReleases.setHasFixedSize(true);
        rcNewReleases.setAdapter(adapterTrack);
        Call<ArrayList<Track>> call= apiServices.getTracks(0,null);
        call.enqueue(new Callback<ArrayList<Track>>() {
            @Override
            public void onResponse(Call<ArrayList<Track>> call,Response<ArrayList<Track>> response) {
                for (Track track:response.body()
                        ) {
                    tracks.add(track);
                }
                adapterTrack.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<ArrayList<Track>> call,Throwable t) {
            }
        });

        adapterTrack.setOnItemClickListener(new AdapterTrack.OnItemClickListener() {
            @Override
            public void onItemClick(View view,int position) {
                Intent intent = new Intent(ActivityHome.ON_TRACK_CLICK_PLAY);
                Bundle bundle = new Bundle();
                bundle.putInt("TRACK_INDEX",position);
                bundle.putSerializable("TRACKS",tracks);
                intent.putExtra("ON_TRACK_CLICK_ITEM",bundle);
                getActivity().sendBroadcast(intent);
            }
        });
    }

    void loadCategory(){
        categories.clear();
        adapterCategories = new AdapterCategories(getActivity(),categories,R.layout.row_category_item);
        rcCategories.setLayoutManager(new GridLayoutManager(getActivity(),2));
        rcCategories.setHasFixedSize(true);
        rcCategories.setAdapter(adapterCategories);
        adapterCategories.setOnItemClickListener(new AdapterCategories.OnItemClickListener() {
            @Override
            public void onItemClick(View view,int position) {
                mListener.goToTrackInCategory(categories.get(position).getId(),categories.get(position).getTitle());
            }
        });
        Call<ArrayList<Categories>> call= apiServices.getCategories(0,4,null);
        call.enqueue(new Callback<ArrayList<Categories>>() {
            @Override
            public void onResponse(Call<ArrayList<Categories>> call,Response<ArrayList<Categories>> response) {
                for (Categories category:response.body()
                        ) {
                    categories.add(category);
                }
                adapterCategories.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<ArrayList<Categories>> call,Throwable t) {
            }
        });

    }



错误

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: lrandomdev.com.online.mp3player,PID: 11063
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Iterator java.util.ArrayList.iterator()' on a null object reference
        at lrandomdev.com.online.mp3player.fragments.FragmentHome$8.onResponse(FragmentHome.java:194)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6694)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我对FragmentHome.java这一行感到怀疑

  void loadAlbums(){
        albums.clear();
        adapterAlbum=new AdapterAlbum(getActivity(),Response<ArrayList<Album>> response) {
                for (Album album:response.body()
                        ) {
                    albums.add(album);
                }
                adapterAlbum.notifyDataSetChanged();
            }

解决方法

只需检查:

  1. 调用响应对象不为空。

  2. 调用响应中ArrayList的引用为空。

  3. 用于响应Arraylist中的空引用。

    public void onResponse(Call<ArrayList<Album>> call,Response<ArrayList<Album>> response) {
        for (Album album:response.body()
                ) {
            albums.add(album);
        }
        adapterAlbum.notifyDataSetChanged();
    }
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...