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()
为空。因此,您需要检查该响应的实例化和发送位置,并确保它的正文不为空。
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()
为空。因此,您需要检查该响应的实例化和发送位置,并确保它的正文不为空。