java - 尝试在空对象引用上调用虚拟方法 'java.lang.Long com.google.firebase.firestore.DocumentSnapshot.getLong(java.lang.String)'

标签 java firebase google-cloud-firestore

这个问题在这里已经有了答案:





What is a NullPointerException, and how do I fix it?

(12 个回答)


1年前关闭。




请帮我

    public class ProductDetailsActivity extends AppCompatActivity {

    public static  boolean running_wishlist_query = false;
    public static  boolean running_rating_query = false;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product_details);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


        productID = getIntent().getStringExtra("PRODUCT_ID");



        inititalRating = -1;


        firebaseFirestore = FirebaseFirestore.getInstance();

        final List<String> productImages = new ArrayList<>();


        firebaseFirestore.collection("PRODUCTS").document(productID)
                .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            documentSnapshot = task.getResult();

                            for (long x = 1; x < documentSnapshot.getLong("no_of_product_images") + 1; x++) {
                                productImages.add(documentSnapshot.getString("product_image_" + x));
                            }
                            ProductImagesAdapter productImagesAdapter = new ProductImagesAdapter(productImages);
                            productImagesViewPager.setAdapter(productImagesAdapter);

                            productTitle.setText(documentSnapshot.getString("product_title"));
                            averageRatingMiniView.setText(String.valueOf(documentSnapshot.get("average_rating")));
                            totalRatingMiniView.setText("(" + documentSnapshot.getLong("total_ratings") + ")ratings");
                            productPrice.setText("TK." + documentSnapshot.getString("product_price") + "/-");
                            cuttedPrice.setText("TK." + documentSnapshot.getString("cutted_price") + "/-");
                            if (documentSnapshot.getBoolean("COD")) {
                                codIndicator.setVisibility(View.VISIBLE);
                                tvCodIndicator.setVisibility(View.VISIBLE);
                            } else {
                                codIndicator.setVisibility(View.INVISIBLE);
                                tvCodIndicator.setVisibility(View.INVISIBLE);
                            }
                            rewardTitle.setText(documentSnapshot.getLong("free_coupens") + documentSnapshot.getString("free_coupen_title"));
                            rewardBody.setText(documentSnapshot.getString("free_coupen_body"));
                            if (documentSnapshot.getBoolean("use_tab_layout")) {
                                productDetailsTabsContainer.setVisibility(View.VISIBLE);
                                productDetailsOnlyContainer.setVisibility(View.GONE);
                                productDescription = documentSnapshot.getString("product_description");
                                productOtherDetails = documentSnapshot.getString("product_other_details");

                                for (long x = 1; x < documentSnapshot.getLong("total_spec_titles") + 1; x++) {
                                    productSpecificationModelList.add(new ProductSpecificationModel(0, documentSnapshot.getString("spec_title_" + x)));
                                    for (long y = 1; y < documentSnapshot.getLong("spec_title_" + x + "_total_fields") + 1; y++) {
                                        productSpecificationModelList.add(new ProductSpecificationModel(1, documentSnapshot.getString("spec_title_" + x + "_field_" + y + "_name"),
                                                documentSnapshot.getString("spec_title_" + x + "_field_" + y + "_value")));
                                    }
                                }
                            } else {
                                productDetailsTabsContainer.setVisibility(View.GONE);
                                productDetailsOnlyContainer.setVisibility(View.GONE);
                                productOnlyDescriptionBody.setText(documentSnapshot.getString("product_description"));
                            }
                            totalRatings.setText(documentSnapshot.getLong("total_ratings") + " ratings");

                            for (int x = 0; x < 5; x++) {
                                TextView rating = (TextView) ratingsNumberContainer.getChildAt(x);
                                rating.setText(String.valueOf(documentSnapshot.getLong((5 - x) + "_star")));

                                ProgressBar progressBar = (ProgressBar) ratingsProgressbarContainer.getChildAt(x);
                                int maxProgress = Integer.parseInt(String.valueOf(documentSnapshot.getLong("total_ratings")));
                                progressBar.setMax(maxProgress);
                                progressBar.setProgress(Integer.parseInt(String.valueOf(documentSnapshot.getLong((5 - x) + "_star"))));

                            }
                            totalRatingsFigure.setText(String.valueOf(documentSnapshot.getLong("total_ratings")));
                            averageRating.setText(String.valueOf(documentSnapshot.get("average_rating")));
                            productDetailsViewPager.setAdapter(new ProductDetailsAdapter(getSupportFragmentManager(), productDescription, productOtherDetails, productSpecificationModelList, productDetailsTabLayout.getTabCount()));

                            if(currentUser != null) {
                                if(DBqueries.myRating.size() == 0){
                                        DBqueries.loadRatingList(ProductDetailsActivity.this);
                                }
                                if (DBqueries.wishList.size() == 0) {
                                    DBqueries.loadWishList(ProductDetailsActivity.this, loadingDialog,false);
                                } else {
                                    loadingDialog.dismiss();
                                }
                            }else{
                                loadingDialog.dismiss();
                            }

                            if(DBqueries.myRatedIds.contains(productID)){
                                int index = DBqueries.myRatedIds.indexOf(productID);
                                inititalRating = Integer.parseInt(String.valueOf(DBqueries.myRating.get(index)));
                                setRating(inititalRating);
                            }

                            if(DBqueries.wishList.contains(productID)){
                                ALREADY_ADDED_TO_WISHLIST = true;
                                addToWishlistBtn.setSupportImageTintList(ColorStateList.valueOf(getResources().getColor(R.color.colorPrimary)));
                            }else {
                                addToWishlistBtn.setSupportImageTintList(ColorStateList.valueOf(Color.parseColor("#9e9e9e")));
                                ALREADY_ADDED_TO_WISHLIST = false;
                            }

                        } else {
                            loadingDialog.dismiss();
                            String error = task.getException().getMessage();
                            Toast.makeText(ProductDetailsActivity.this, error, Toast.LENGTH_SHORT).show();
                        }
                    }
                });


        //////rating layout
        rateNowContainer = findViewById(R.id.rate_now_container);
        for(int x = 0; x< 6;x++){
            rateNowContainer.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
                @Override
                public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
                    final int starPosition = (int) ratingBar.getRating();
                    if(currentUser == null){
                        signInDialog.show();
                    }else {
                        if(!running_rating_query){
                            running_rating_query = true;
                            setRating(starPosition);
                            Map<String, Object> updateRating = new HashMap<>();
                            //int initialTestRating  = Integer.parseInt(String.valueOf(documentSnapshot.getLong("rating_" + finalX)));
                            if(DBqueries.myRatedIds.contains(productID)){

                                updateRating.put(inititalRating+"_star", documentSnapshot.getLong(inititalRating+"_star") - 1); // -1
                                updateRating.put(starPosition+"_star", documentSnapshot.getLong(starPosition+"_star")+ 1); // +1
                                updateRating.put("average_rating",String.valueOf(calculateAverageRating()));

                            }else {
                                updateRating.put(starPosition+ "_star", documentSnapshot.getLong(starPosition+ "_star")+1);
                                updateRating.put("total_ratings", documentSnapshot.getLong("total_ratings")+1);
                                updateRating.put("average_rating", String.valueOf(calculateAverageRating()));

                            }

                            firebaseFirestore.collection("PRODUCTS").document(productID)
                                    .update(updateRating).addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {


                                        Map<String, Object> rating = new HashMap<>();
                                        if(DBqueries.myRatedIds.contains(productID)){
                                            rating.put("rating_"+DBqueries.myRatedIds.indexOf(productID),starPosition);
                                        }else {
                                            rating.put("list_size", DBqueries.myRatedIds.size() + 1);
                                            rating.put("product_ID_" + DBqueries.myRatedIds.size(), productID);
                                            rating.put("rating_" + DBqueries.myRatedIds.size(), (long) starPosition);
                                        }

                                        firebaseFirestore.collection("USERS").document(currentUser.getUid()).collection("USER_DATA").document("MY_RATINGS")
                                                .update(rating).addOnCompleteListener(new OnCompleteListener<Void>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Void> task) {
                                                if (task.isSuccessful()) {

                                                    if(DBqueries.myRatedIds.contains(productID)){

                                                        DBqueries.myRating.set(DBqueries.myRatedIds.indexOf(productID), (long) starPosition);

                                                        TextView oldRating = (TextView) ratingsNumberContainer.getChildAt(5 - inititalRating);
                                                        TextView finalRating = (TextView) ratingsNumberContainer.getChildAt(5 - starPosition);

                                                        oldRating.setText(String.valueOf(Integer.parseInt(oldRating.getText().toString())-1));
                                                        finalRating.setText(String.valueOf(Integer.parseInt(finalRating.getText().toString()) + 1));



                                                    }else {
                                                        DBqueries.myRatedIds.add(productID);
                                                        DBqueries.myRating.add((long) starPosition);

                                                        TextView rating = (TextView) ratingsNumberContainer.getChildAt(5 - starPosition);
                                                        rating.setText(String.valueOf(Integer.parseInt(rating.getText().toString()) + 1));


                                                        totalRatingMiniView.setText("(" + (documentSnapshot.getLong("total_ratings")) + ")ratings");
                                                        totalRatings.setText(documentSnapshot.getLong("total_ratings") + " ratings");
                                                        totalRatingsFigure.setText(String.valueOf(documentSnapshot.getLong("total_ratings")));



                                                        Toast.makeText(ProductDetailsActivity.this, "Thank you ! for rating", Toast.LENGTH_SHORT).show();
                                                    }

                                                    averageRating.setText(String.valueOf(calculateAverageRating()));
                                                    averageRatingMiniView.setText(String.valueOf(calculateAverageRating()));

                                                    for (int x = 0; x < 5; x++) {
                                                        TextView ratingfigures = (TextView) ratingsNumberContainer.getChildAt(x);

                                                        ProgressBar progressBar = (ProgressBar) ratingsProgressbarContainer.getChildAt(x);
                                                        if(!DBqueries.myRatedIds.contains(productID)) {
                                                            int maxProgress = Integer.parseInt(String.valueOf(documentSnapshot.getLong("total_ratings")));
                                                            progressBar.setMax(maxProgress);
                                                        }
                                                        progressBar.setProgress(Integer.parseInt(ratingfigures.getText().toString()));

                                                    }


                                                } else {
                                                    setRating(inititalRating);
                                                    String error = task.getException().getMessage();
                                                    Toast.makeText(ProductDetailsActivity.this, error, Toast.LENGTH_SHORT).show();
                                                }
                                                running_rating_query = false;
                                            }
                                        });

                                    } else {
                                        running_rating_query = false;
                                        setRating(inititalRating);
                                        String error = task.getException().getMessage();
                                        Toast.makeText(ProductDetailsActivity.this, error, Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });

                        }
                    }
                }
            });
        }
        //////rating layout

    }

    @Override
    protected void onStart() {
        super.onStart();
        currentUser = FirebaseAuth.getInstance().getCurrentUser();
        if(currentUser == null){
            coupenRedemptionLayout.setVisibility(View.GONE);
        }else {
            coupenRedemptionLayout.setVisibility(View.VISIBLE);
        }

        if(currentUser != null) {
            if(DBqueries.myRating.size() == 0){
                DBqueries.loadRatingList(ProductDetailsActivity.this);
            }
            if (DBqueries.wishList.size() == 0) {
                DBqueries.loadWishList(ProductDetailsActivity.this, loadingDialog,false);
            } else {
                loadingDialog.dismiss();
            }
        }else{
            loadingDialog.dismiss();
        }

        if(DBqueries.myRatedIds.contains(productID)){
            int index = DBqueries.myRatedIds.indexOf(productID);
            inititalRating = Integer.parseInt(String.valueOf(DBqueries.myRating.get(index)));
            setRating(inititalRating);
        }

        if(DBqueries.wishList.contains(productID)){
            ALREADY_ADDED_TO_WISHLIST = true;
            addToWishlistBtn.setSupportImageTintList(getResources().getColorStateList(R.color.colorPrimary));
        }else{
            ALREADY_ADDED_TO_WISHLIST = false;
            addToWishlistBtn.setSupportImageTintList(ColorStateList.valueOf(Color.parseColor("#9e9e9e")));
        }

    }


    public static void setRating(int starPosition) {
        rateNowContainer.setRating(starPosition);

    }

    private float calculateAverageRating(){
        float totalStars = documentSnapshot.getLong("1_star")*1 +
                documentSnapshot.getLong("2_star")*2 +
                documentSnapshot.getLong("3_star")*3 +
                documentSnapshot.getLong("4_star")*4 +

        if(documentSnapshot.getLong("total_ratings") != null && totalStars != 0){
            return totalStars / documentSnapshot.getLong("total_ratings");
        }else {
            return 0;
        }
    }   
}

这是错误

E/AndroidRuntime: 致命异常: main
进程:com.gabwire.mymall,PID:3985
java.lang.RuntimeException:无法启动 Activity ComponentInfo{com.gabwire.mymall/com.gabwire.mymall.ProductDetailsActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'java.lang.Long com.google.firebase。 firestore.DocumentSnapshot.getLong(java.lang.String)' 在空对象引用上
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
在 android.app.ActivityThread.access$800(ActivityThread.java:153)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)
在 android.os.Handler.dispatchMessage(Handler.java:102)
在 android.os.Looper.loop(Looper.java:135)
在 android.app.ActivityThread.main(ActivityThread.java:5305)
在 java.lang.reflect.Method.invoke( native 方法)
在 java.lang.reflect.Method.invoke(Method.java:372)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.Long com.google.firebase.firestore.DocumentSnapshot.getLong(java.lang.String)”
在 com.gabwire.mymall.ProductDetailsActivity$4.onRatingChanged(ProductDetailsActivity.java:372)
在 android.widget.RatingBar.dispatchRatingChange(RatingBar.java:319)
在 android.widget.RatingBar.onProgressRefresh(RatingBar.java:262)
在 android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:1262)
在 android.widget.ProgressBar.refreshProgress(ProgressBar.java:1274)
在 android.widget.ProgressBar.setProgress(ProgressBar.java:1321)
在 android.widget.ProgressBar.setProgress(ProgressBar.java:1302)
在 android.widget.RatingBar.setRating(RatingBar.java:198)
在 com.gabwire.mymall.ProductDetailsActivity.setRating(ProductDetailsActivity.java:633)
在 com.gabwire.mymall.ProductDetailsActivity.onStart(ProductDetailsActivity.java:609)
在 android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
在 android.app.Activity.performStart(Activity.java:6006)
在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2290)
在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2392)
在 android.app.ActivityThread.access$800(ActivityThread.java:153)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305)
在 android.os.Handler.dispatchMessage(Handler.java:102)
在 android.os.Looper.loop(Looper.java:135)
在 android.app.ActivityThread.main(ActivityThread.java:5305)
在 java.lang.reflect.Method.invoke( native 方法)
在 java.lang.reflect.Method.invoke(Method.java:372)
在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
I/Process:发送信号。 PID:3985 SIG:9

最佳答案

即使文档不存在,任务仍然会成功。

您需要检查文档快照是否存在。

firebaseFirestore.collection("PRODUCTS").document(productID)
        .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    documentSnapshot = task.getResult();
                    if (documentSnapshot.exists()) {
                        ...

请参阅 getting a document 上的文档.

关于java - 尝试在空对象引用上调用虚拟方法 'java.lang.Long com.google.firebase.firestore.DocumentSnapshot.getLong(java.lang.String)',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62420975/

相关文章:

google-cloud-platform - 如何修复 Elixir 中的 Google Firestore 问题?

java - 将另一个静态方法作为 java 程序的入口点?

java - JAVA中改变图像尺寸而不改变分辨率

java - 将枚举类作为参数传递给java中的方法

javascript - Service Worker 仅显示第一个推送通知(来自云消息传递),直到我重新加载 - 工作人员收到消息

java - Firebase/Firestore 聊天应用程序的数据模型

java - 删除/修改 SOAP 响应消息的 XML 声明

javascript - Firebase - 将文件放在多个目录中

javascript - 将 Firestore 数据添加到 DataTable

javascript - 如何使用 react.js 中的 WHERE 查询计算 Firebase Firestore 中集合中的文档数