Java Android Studio项目中的错误

Java Android Studio项目中的错误,java,android,json,nullpointerexception,android-json,Java,Android,Json,Nullpointerexception,Android Json,我有两个活动:Feed和User。两个活动使用相同的适配器、相同的布局,但在第一个活动中,适配器加载提要(并崩溃),在第二个活动中,适配器加载用户的提要(而不是崩溃) 这是我在控制台中为Feed.class找到的内容: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.flaunder.flaunder, PID: 5906 java.lang.NullPointerException

我有两个活动:Feed和User。两个活动使用相同的适配器、相同的布局,但在第一个活动中,适配器加载提要(并崩溃),在第二个活动中,适配器加载用户的提要(而不是崩溃)

这是我在控制台中为Feed.class找到的内容:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.flaunder.flaunder, PID: 5906
              java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
                  at com.android.volley.toolbox.ImageLoader.getCacheKey(ImageLoader.java:503)
                  at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:213)
                  at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:191)
                  at com.android.volley.toolbox.ImageLoader.get(ImageLoader.java:182)
                  at com.flaunder.flaunder.QuestionsAdapter.onBindViewHolder(QuestionsAdapter.java:69)
                  at com.flaunder.flaunder.QuestionsAdapter.onBindViewHolder(QuestionsAdapter.java:30)
                  at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6062)
                  at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6095)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5277)
                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5153)
                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2061)
                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1445)
                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1408)
                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:580)
                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3374)
                  at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3183)
                  at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3627)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:131)
                  at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
                  at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1367)
                  at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:849)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1193)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                  at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                  at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                  at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
                  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
                  at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
                  at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
                  at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678)
                  at android.view.View.layout(View.java:16630)
                  at android.view.ViewGroup.layout(ViewGroup.java:5437)
                  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171)
                at android
适配器从服务器的数据库获取json并解析它们。json的字段与提要和用户的字段相同

适配器中的代码:

@Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        regular = Typeface.createFromAsset(context.getAssets(),"OpenSans-Regular.ttf");
        bold = Typeface.createFromAsset(context.getAssets(),"OpenSans-Semibold.ttf");

        //Getting the particular item from the list
        QuestionList questionHero =  questionList.get(position);

        //Loading image from url
        imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();
        imageLoader.get(questionHero.getUserphoto(), ImageLoader.getImageListener(holder.genUserPhoto, R.drawable.header, android.R.drawable.ic_dialog_alert));
        imageLoader.get(questionHero.getPhoto(), ImageLoader.getImageListener(holder.genPhoto, R.drawable.header, android.R.drawable.ic_dialog_alert));

        //Showing data on the views
        holder.genUserPhoto.setImageUrl(questionHero.getUserphoto(), imageLoader);
        holder.genQuestion.setText(questionHero.getQuestion());
        holder.genQuestion.setTypeface(bold);
        holder.genAnswer.setText(questionHero.getAnswer());
        holder.genAnswer.setTypeface(regular);
        holder.genFroms.setText(questionHero.getFroms());
        holder.genFroms.setTypeface(regular);
        holder.genTos.setText(questionHero.getTos());
        holder.genTos.setTypeface(regular);
        holder.genFromslogin.setText(questionHero.getFromslogin());
        holder.genToslogin.setText(questionHero.getToslogin());
        holder.genToslogin2.setText(questionHero.getToslogin());
        holder.genDate.setText(questionHero.getDate());
        holder.genDate.setTypeface(regular);
        holder.genLikenum.setText(questionHero.getLikenum());
        holder.genLikenum.setTypeface(regular);
        holder.genCommentnum.setText(questionHero.getCommentnum());
        holder.genCommentnum.setTypeface(regular);
        holder.genPhoto.setImageUrl(questionHero.getPhoto(), imageLoader);
        holder.genVideo.setText(questionHero.getVideo());
        holder.genId.setText(questionHero.getQid());

    }
提要:


因此,在解析JSON时,一些键可能为null或不存在。在这种情况下,您的questionHero将包含null。所以在调用代码之前,你应该这样检查

 if (questionHero.getUserphoto() != null ) {
//in case you handle visibility in else block make //holder.genUserPhoto.setVisibility(View.VISIBLE) here visible 
     imageLoader.get(questionHero.getUserphoto(), ImageLoader.getImageListener(holder.genUserPhoto, R.drawable.header, android.R.drawable.ic_dialog_alert));
    } else {
//reset image by questionHero.genUserPhoto.setImageBitmap(null), or handle //visibility of holder.genUserPhoto
}
您可以用同样的方式为
questionHero.getPhoto()编写

为什么需要可见性或重置?

“回收器视图”重复使用项目,以便在其他位置重复使用相同的视图,以防您无法处理,最终在错误的位置显示错误的图像

两个性能提示

regular = Typeface.createFromAsset(context.getAssets(),"OpenSans-Regular.ttf");
        bold = Typeface.createFromAsset(context.getAssets(),"OpenSans-Semibold.ttf");
永远不要在bindViewHolder中修改此类代码,当您滚动时,会再次调用此方法,每次它都会从资源中创建字体,这足以使您的滚动变慢。您应该为此创建一个singleton类,该类将创建一次字体并缓存它,并在需要时提供给应用程序

 holder.genDate.setTypeface(regular);
imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();

现在您已经在bindViewHolder中编写了此代码,将此代码移动到createViewHolder,因为设置字体一次就足够了。同样,您应该获得一次图像加载器,虽然它不会有太大的区别,因为图像加载器本身是单例的,但在ViewHolder级别仍然很好,bindViewHolder方法只能处理每个recycler视图项目将更改的视图数据或属性。

共享一些代码没有代码崩溃日志会有什么帮助?请发布一个。在将url传递到图像适配器com.flaunder.flaunder.QuestionsAdapter.onBindViewHolder之前,您应该检查url是否为null(QuestionsAdapter.java:69)@AkhilDad json中的照片字段是空的,但它适用于具有相同适配器的User.class。噢,非常感谢您的帮助、解决方案、时间和提示!您真是一个好人!
regular = Typeface.createFromAsset(context.getAssets(),"OpenSans-Regular.ttf");
        bold = Typeface.createFromAsset(context.getAssets(),"OpenSans-Semibold.ttf");
 holder.genDate.setTypeface(regular);
imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();