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

NPE hard to spot from the logcat it seems to be the Arraylist but each item should be set

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

所以它在第 119 行说 ArrayList 为 null 这是一个简单的通过 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);
        }

任何其他 类 需要就问。谢谢。

堆栈跟踪:

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.onResponse(DataRepository.java:119)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall.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()' on a null object reference. 这意味着 response.getBody() 为空。因此,您需要检查该响应的实例化和发送位置,并确保它的正文不为空。