java - NPE 很难从 logcat 中发现它似乎是 Arraylist 但每个项目都应该设置

标签 java android retrofit

出于学习目的构建 GitHub Repo 应用程序,我陷入了 NullPointerException 的世界。

所以它在第 119 行说 ArrayList 为空,这是通过 Retrofit 的简单回调 我尝试获取数据,然后进一步设置数据。我不确定在这个过程中到底哪里失败了,因为它只是指向第 119 行数组的初始化,但我正在迭代该数组,然后将每个项目添加到集合中。

拥有更多专业知识的人能够发现我无法发现的东西。

欢迎任何建议。

Call<GitHubRepo> call = gitHubClient.getRepos(searchTerm, pageNumber, resultsPerPage);
call.enqueue(new Callback<GitHubRepo>() {
    @Override
    public void onResponse(Call<GitHubRepo> call, Response<GitHubRepo> response) {
        ArrayList<Item> itemsList = response.body().getItems();
        for(int i = 0; i < itemsList.size(); i++) {
            ModelCachedGitHubProject currentProject = new ModelCachedGitHubProject();
            Item responseItem = itemsList.get(i);
            currentProject.setOwnerName(responseItem.getOwner().getLogin());
            currentProject.setRepoName(responseItem.getName());
            currentProject.setRepoSize(responseItem.getSize());
            currentProject.setHasWiki(responseItem.isHas_wiki());
            currentProject.setCreatedAt(responseItem.getCreated_at());
            currentProject.setPushedAt(responseItem.getPushed_at());
            currentProject.setUpdatedAt(responseItem.getUpdated_at());
            currentProject.setHtmlUrl(responseItem.getHtml_url());
            currentProject.setAvatarUrl(responseItem.getOwner().getAvatar_url());
            currentProject.setLanguage(responseItem.getLanguage());
            currentProject.setForksCount(responseItem.getForks_count());
            currentProject.setScore(responseItem.getScore());
            currentProject.setDescription(responseItem.getDescription());
            gitHubProjectsList.add(currentProject);
        }

需要任何其他类(class),请询问。谢谢。

堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.benmohammad.repoapp, PID: 2325
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList com.benmohammad.repoapp.data.webservice.apiresponse.GitHubRepo.getItems()' on a null object reference
        at com.benmohammad.repoapp.data.DataRepository$1.onResponse(DataRepository.java:119)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda

GitHub 存储库 Repo

谢谢

public void updateFromWebservice(final String searchTerm, final int pageNumber, int resultsPerPage) {
        webServiceMessageCallStatus.setValue(WebServiceMessage.UPDATING_STATUS);
        final List<ModelCachedGitHubProject> gitHubProjectsList =  new ArrayList<>();
        if(retrofit == null || gitHubClient == null) {
            retrofit = new Retrofit.Builder().baseUrl(GitHubClientService.BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
            gitHubClient = retrofit.create(GitHubClientService.class);
        }
        Call<GitHubRepo> call = gitHubClient.getRepos(searchTerm, pageNumber, resultsPerPage);
        call.enqueue(new Callback<GitHubRepo>() {
            @Override
            public void onResponse(Call<GitHubRepo> call, Response<GitHubRepo> response) {
                ArrayList<Item> itemsList = response.body().getItems();
                for(int i = 0; i < itemsList.size(); i++) {
                    ModelCachedGitHubProject currentProject = new ModelCachedGitHubProject();
                    Item responseItem = itemsList.get(i);
                    currentProject.setOwnerName(responseItem.getOwner().getLogin());
                    currentProject.setRepoName(responseItem.getName());
                    currentProject.setRepoSize(responseItem.getSize());
                    currentProject.setHasWiki(responseItem.isHas_wiki());
                    currentProject.setCreatedAt(responseItem.getCreated_at());
                    currentProject.setPushedAt(responseItem.getPushed_at());
                    currentProject.setUpdatedAt(responseItem.getUpdated_at());
                    currentProject.setHtmlUrl(responseItem.getHtml_url());
                    currentProject.setAvatarUrl(responseItem.getOwner().getAvatar_url());
                    currentProject.setLanguage(responseItem.getLanguage());
                    currentProject.setForksCount(responseItem.getForks_count());
                    currentProject.setScore(responseItem.getScore());
                    currentProject.setDescription(responseItem.getDescription());
                    gitHubProjectsList.add(currentProject);
                }

                if(!gitHubProjectsList.isEmpty()) {
                    boolean clearPreviousCache;
                    if(pageNumber == 1) {
                        clearPreviousCache = true;
                        saveLastSearchTerm(searchTerm);

                    } else clearPreviousCache = false;
                    cacheProjectsList(gitHubProjectsList, clearPreviousCache);
                    setLastRefreshDate(new Date());
                    webServiceMessageCallStatus.postValue(WebServiceMessage.ON_RESPONSE_SUCCESS);
                } else {
                    if(pageNumber == 1)
                        webServiceMessageCallStatus.postValue(WebServiceMessage.ON_RESPONSE_NOTHING_FOUND);
                    else {
                        webServiceMessageCallStatus.postValue(WebServiceMessage.ON_RESPONSE_NO_MORE_RESULTS);
                    }
                }
            }

            @Override
            public void onFailure(Call<GitHubRepo> call, Throwable t) {
                webServiceMessageCallStatus.postValue(WebServiceMessage.ON_FAILURE);
            }
        });
    }

最佳答案

响应为空,假设您正在谈论 ArrayList itemsList 行。我们看不到行号。如果您查看堆栈跟踪,它会在空对象引用上显示 .getItems()'。 这意味着 response.getBody() 为 null。因此,您需要检查该响应正在初始化(发送)的位置,并确保该类/服务没有问题。

关于java - NPE 很难从 logcat 中发现它似乎是 Arraylist 但每个项目都应该设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60304811/

相关文章:

java - 按下按钮时服务未启动?

java - 如何更改 android 中 videoview 的参数?

android - 从android上传图片到golang服务器并保存在mongodb中

android - 将 CookieHandler 与 OkHttp 和 Retrofit 2 一起使用

java - spring compensating.support.DefaultCompensatingTransactionOperationManager 提交在递归删除时失败

java - 在扩展 JFrame 的类中的另一个 JFrame 上绘制一条线

android - React Native - 在焦点上更改按钮颜色

android - mp4 容器中的多路复用原始 h264

android - 改造:预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY

java - Grails-找不到JDK