如何为 webSite.getSources().size(); 修复此 NullPointerException?
How do I fix this NullPointerException for webSite.getSources().size();
我不知道如何解决这个 NullPointerException 错误 这个项目:
(看到类似的问题,但没有帮助)
MainActivity.java
public class MainActivity extends AppCompatActivity {
RecyclerView listWebsite;
RecyclerView.LayoutManager layoutManager;
NewsService mService;
ListSourceAdapter adapter;
SpotsDialog dialog;
SwipeRefreshLayout swipeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Init cache
Paper.init(this);
//Init Service
mService = Common.getNewsService();
//Init View
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);
swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadWebsiteSource(true);
}
});
listWebsite = (RecyclerView) findViewById(R.id.list_source);
listWebsite.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
listWebsite .setLayoutManager(layoutManager);
dialog = new SpotsDialog(this);
loadWebsiteSource(false);
}
private void loadWebsiteSource(boolean isRefreshed) {
if(!isRefreshed)
{
String cache = Paper.book().read("cache");
if(cache != null && !cache.isEmpty())
{
WebSite webSite = new Gson().fromJson(cache,WebSite.class); //Convert cache from Json to Object
adapter = new ListSourceAdapter(getBaseContext(),webSite);
adapter.notifyDataSetChanged();
listWebsite.setAdapter(adapter);
}
else
{
dialog.show();
//Fetch new data
mService.getSources().enqueue(new Callback<WebSite>() {
@Override
public void onResponse(Call<WebSite> call, Response<WebSite> response) {
adapter = new ListSourceAdapter(getBaseContext(),response.body());
adapter.notifyDataSetChanged();
listWebsite.setAdapter(adapter);
//Save to cache
Paper.book().write("cache", new Gson().toJson(response.body()));
}
@Override
public void onFailure(Call<WebSite> call, Throwable t) {
}
});
}
}
else //If from Swipe to Refresh
{
dialog.show();
//Fetch new data
mService.getSources().enqueue(new Callback<WebSite>() {
@Override
public void onResponse(Call<WebSite> call, Response<WebSite> response) {
adapter = new ListSourceAdapter(getBaseContext(),response.body());
adapter.notifyDataSetChanged();
listWebsite.setAdapter(adapter);
//Save to cache
Paper.book().write("cache", new Gson().toJson(response.body()));
//Dismiss refresh progressing
swipeLayout.setRefreshing(false);
}
@Override
public void onFailure(Call<WebSite> call, Throwable t) {
}
});
}
}
}
ListSourceAdapter.java
class ListSourceViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener
{
ItemClickListener itemClickListener;
TextView source_title;
CircleImageView source_image;
public ListSourceViewHolder(View itemView) {
super(itemView);
source_image = (CircleImageView) itemView.findViewById(R.id.source_image);
source_title = (TextView) itemView.findViewById(R.id.source_name);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view) {
itemClickListener.onClick(view,getAdapterPosition(),false);
}
}
public class ListSourceAdapter extends RecyclerView.Adapter<ListSourceViewHolder> {
private Context context;
private WebSite webSite;
private FaviconGrabberService mService;
public ListSourceAdapter(Context context, WebSite webSite) {
this.context = context;
this.webSite = webSite;
mService = Common.getIconService();
}
@NonNull
@Override
public ListSourceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.source_layout, parent, false);
return new ListSourceViewHolder(itemView);
}
@Override
public void onBindViewHolder(final ListSourceViewHolder holder, int position) {
StringBuilder faviconAPI = new StringBuilder("https://favicongrabber.com/");
faviconAPI.append(webSite.getSources().get(position).getUrl());
mService.getIconUrl(faviconAPI.toString())
.enqueue(new Callback<FaviconGrabber>() {
@Override
public void onResponse(Call<FaviconGrabber> call, Response<FaviconGrabber> response) {
if(response.body().getIcons().size() > 0)
{
Picasso.with(context)
.load(response.body().getIcons().get(0).getUrl())
.into(holder.source_image);
}
}
@Override
public void onFailure(Call<FaviconGrabber> call, Throwable t) {
}
});
holder.source_title.setText(webSite.getSources().get(position).getName());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
//Implement part 2
}
});
}
@Override
public int getItemCount() {
return webSite.getSources().size(); //here I get a NullPointerException
}
}
我收到此错误消息 return webSite.getSources().size(); :
java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'java.util.List ...Model.WebSite.getSources()'
在...Adapter.ListSourceAdapter.getItemCount(ListSourceAdapter.java:110)
如果你需要,我可以提供项目的其他部分,tnx!
错误告诉您对象引用 webSite
为空。您需要检查调用 ListSourceAdapter
构造函数的进程,看看是什么导致它向构造函数调用发送 null。
我不知道如何解决这个 NullPointerException 错误 这个项目: (看到类似的问题,但没有帮助)
MainActivity.java
public class MainActivity extends AppCompatActivity {
RecyclerView listWebsite;
RecyclerView.LayoutManager layoutManager;
NewsService mService;
ListSourceAdapter adapter;
SpotsDialog dialog;
SwipeRefreshLayout swipeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Init cache
Paper.init(this);
//Init Service
mService = Common.getNewsService();
//Init View
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);
swipeLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadWebsiteSource(true);
}
});
listWebsite = (RecyclerView) findViewById(R.id.list_source);
listWebsite.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
listWebsite .setLayoutManager(layoutManager);
dialog = new SpotsDialog(this);
loadWebsiteSource(false);
}
private void loadWebsiteSource(boolean isRefreshed) {
if(!isRefreshed)
{
String cache = Paper.book().read("cache");
if(cache != null && !cache.isEmpty())
{
WebSite webSite = new Gson().fromJson(cache,WebSite.class); //Convert cache from Json to Object
adapter = new ListSourceAdapter(getBaseContext(),webSite);
adapter.notifyDataSetChanged();
listWebsite.setAdapter(adapter);
}
else
{
dialog.show();
//Fetch new data
mService.getSources().enqueue(new Callback<WebSite>() {
@Override
public void onResponse(Call<WebSite> call, Response<WebSite> response) {
adapter = new ListSourceAdapter(getBaseContext(),response.body());
adapter.notifyDataSetChanged();
listWebsite.setAdapter(adapter);
//Save to cache
Paper.book().write("cache", new Gson().toJson(response.body()));
}
@Override
public void onFailure(Call<WebSite> call, Throwable t) {
}
});
}
}
else //If from Swipe to Refresh
{
dialog.show();
//Fetch new data
mService.getSources().enqueue(new Callback<WebSite>() {
@Override
public void onResponse(Call<WebSite> call, Response<WebSite> response) {
adapter = new ListSourceAdapter(getBaseContext(),response.body());
adapter.notifyDataSetChanged();
listWebsite.setAdapter(adapter);
//Save to cache
Paper.book().write("cache", new Gson().toJson(response.body()));
//Dismiss refresh progressing
swipeLayout.setRefreshing(false);
}
@Override
public void onFailure(Call<WebSite> call, Throwable t) {
}
});
}
}
}
ListSourceAdapter.java
class ListSourceViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener
{
ItemClickListener itemClickListener;
TextView source_title;
CircleImageView source_image;
public ListSourceViewHolder(View itemView) {
super(itemView);
source_image = (CircleImageView) itemView.findViewById(R.id.source_image);
source_title = (TextView) itemView.findViewById(R.id.source_name);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view) {
itemClickListener.onClick(view,getAdapterPosition(),false);
}
}
public class ListSourceAdapter extends RecyclerView.Adapter<ListSourceViewHolder> {
private Context context;
private WebSite webSite;
private FaviconGrabberService mService;
public ListSourceAdapter(Context context, WebSite webSite) {
this.context = context;
this.webSite = webSite;
mService = Common.getIconService();
}
@NonNull
@Override
public ListSourceViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.source_layout, parent, false);
return new ListSourceViewHolder(itemView);
}
@Override
public void onBindViewHolder(final ListSourceViewHolder holder, int position) {
StringBuilder faviconAPI = new StringBuilder("https://favicongrabber.com/");
faviconAPI.append(webSite.getSources().get(position).getUrl());
mService.getIconUrl(faviconAPI.toString())
.enqueue(new Callback<FaviconGrabber>() {
@Override
public void onResponse(Call<FaviconGrabber> call, Response<FaviconGrabber> response) {
if(response.body().getIcons().size() > 0)
{
Picasso.with(context)
.load(response.body().getIcons().get(0).getUrl())
.into(holder.source_image);
}
}
@Override
public void onFailure(Call<FaviconGrabber> call, Throwable t) {
}
});
holder.source_title.setText(webSite.getSources().get(position).getName());
holder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
//Implement part 2
}
});
}
@Override
public int getItemCount() {
return webSite.getSources().size(); //here I get a NullPointerException
}
}
我收到此错误消息 return webSite.getSources().size(); :
java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'java.util.List ...Model.WebSite.getSources()' 在...Adapter.ListSourceAdapter.getItemCount(ListSourceAdapter.java:110)
如果你需要,我可以提供项目的其他部分,tnx!
错误告诉您对象引用 webSite
为空。您需要检查调用 ListSourceAdapter
构造函数的进程,看看是什么导致它向构造函数调用发送 null。