【问题标题】:Attempt to invoke virtual method 'boolean java.lang.String.isEmpty()' on a null object reference尝试在空对象引用上调用虚拟方法“boolean java.lang.String.isEmpty()”
【发布时间】:2018-07-24 15:54:00
【问题描述】:

请帮助...每当我尝试转到foodDetailActivity..它会将页面扔回注册登录活动?当我调试 fooddetail 活动时..它显示下面提到的 logcat..

public class FoodList extends AppCompatActivity {

    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;

    FirebaseDatabase database;
    DatabaseReference foodList;
    String categoryId="";

    FirebaseRecyclerAdapter<Food,FoodViewHolder> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_list);

        database=FirebaseDatabase.getInstance();
        foodList=database.getReference("Foods");

        recyclerView=findViewById(R.id.recycler_food);
        recyclerView.setHasFixedSize(true);
        layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);

        if(getIntent() !=null)
            categoryId=getIntent().getStringExtra(CategoryId);
        if(!categoryId.isEmpty() && categoryId !=null)
        {
            loadListFood(categoryId);
        }
    }

    private void loadListFood(String categoryId) {
        adapter=new FirebaseRecyclerAdapter<Food, FoodViewHolder>(Food.class,R.layout.food_item,FoodViewHolder.class,
                foodList.orderByChild("MenuId").equalTo(categoryId)) {
            @Override
            protected void populateViewHolder(FoodViewHolder viewHolder, Food model, int position) {

                viewHolder.food_name.setText(model.getName());
                Picasso.with(getBaseContext()).load(model.getImage())
                        .into(viewHolder.food_image);

                final Food local=model;
                viewHolder.setItemClickListener(new ItemClickListener() {
                    @Override
                    public void onClick(View view, int position, boolean isLongClick) {
                        Intent foodDetail=new Intent(FoodList.this,FoodDetail.class);
                      foodDetail.putExtra(FoodId,adapter.getRef(position).getKey());
                        startActivity(foodDetail);
                    }
                });
            }
        };
        Log.d("TAG",""+adapter.getItemCount());
        recyclerView.setAdapter(adapter);
    }
}

这是我的 FoodDetail 活动...

public class FoodDetail extends AppCompatActivity {

    TextView food_name,food_price,food_description;
    ImageView food_image;
    CollapsingToolbarLayout collapsingToolbarLayout;
    FloatingActionButton btnCart;
    ElegantNumberButton numberButton;

    String foodId="";

    FirebaseDatabase database;
    DatabaseReference foods;
    Food currentFood;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_food_detail);

        database = FirebaseDatabase.getInstance();
        foods = database.getReference("Foods");

        numberButton = findViewById(R.id.number_button);
        btnCart = findViewById(R.id.btnCart);
        btnCart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Database(getBaseContext()).addToCart(new Order(
                        foodId,
                        currentFood.getName(),
                        numberButton.getNumber(),
                        currentFood.getPrice(),
                        currentFood.getDiscount()
                ));

                Toast.makeText(FoodDetail.this, "Added to Cart", Toast.LENGTH_SHORT).show();
            }
        });

        food_description = findViewById(R.id.food_description);
        food_name = findViewById(R.id.food_name);
        food_price = findViewById(R.id.food_price);
        food_image = findViewById(R.id.img_food);

        collapsingToolbarLayout = findViewById(R.id.collapsing);

        collapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.ExpandedAppbar);
        collapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.CollapsedAppbar);

        if (getIntent() != null)
            foodId = getIntent().getStringExtra(FoodId);

        if(!foodId.isEmpty())
            getDetailFood(foodId);

    }

    private void getDetailFood(String foodId) {

        foods.child(foodId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                currentFood=dataSnapshot.getValue(Food.class);

                //set image

                Picasso.with(getBaseContext()).load(currentFood.getImage()).into(food_image);
                collapsingToolbarLayout.setTitle(currentFood.getName());

                food_price.setText(currentFood.getPrice());
                food_name.setText(currentFood.getName());

                food_description.setText(currentFood.getDescription());
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
}

“if(!foodId.isEmpty())”中显示错误??

它显示了下面提到的logcat..

02-14 11:49:21.238 6803-6803/com.example.rajatraturi.myrestaur E/AndroidRuntime: 致命异常: main 进程:com.example.rajatraturi.myrestaur,PID:6803 java.lang.RuntimeException:无法启动活动 组件信息{com.example.rajatraturi.myrestaur/com.example.rajatraturi.myrestaur.FoodDetail}: java.lang.NullPointerException:尝试调用虚拟方法 空对象引用上的“布尔 java.lang.String.isEmpty()” 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2423) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2483) 在 android.app.ActivityThread.access$900(ActivityThread.java:153) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5441) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 引起:java.lang.NullPointerException:尝试调用虚拟 空对象引用上的方法“boolean java.lang.String.isEmpty()” 在 com.example.rajatraturi.myrestaur.FoodDetail.onCreate(FoodDetail.java:81) 在 android.app.Activity.performCreate(Activity.java:6303) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2376) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2483) 在 android.app.ActivityThread.access$900(ActivityThread.java:153) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5441) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 02-14 11:49:21.292 6803-6803/com.example.rajatraturi.myrestaur I/进程: 发送信号。 PID:6803 SIG:9

帮我解决这个问题..我没有得到什么问题??

【问题讨论】:

标签: android nullpointerexception


【解决方案1】:

我在您的代码中看不到“FoodId”,您应该确保“FoodId”与另一个活动相同。

【讨论】:

  • 现在,nullpointerexception 已解决...但是在 foodlist 活动之后不断将页面扔回登录活动?并且logcat中没有错误... Intent有什么问题吗?
【解决方案2】:

错误日志表明代码正在尝试对NULL 对象执行isEmpty() 方法。我看到你有两个地方打电话给isEmpty()。在not empty 检查之前,首先检查not null 的对象。像这样的:

public class FoodList extends AppCompatActivity {
    .....

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        .....

        // check for not null first
        if (categoryId !=null && !categoryId.isEmpty())
        {
            loadListFood(categoryId);
        }
    }

}


public class FoodDetail extends AppCompatActivity {
    ....

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        .....

        // check for not null first
        if (foodId != null && !foodId.isEmpty())
            getDetailFood(foodId);

    }

祝你好运!

【讨论】:

  • 感谢您的帮助!!它解决了我的调试问题..现在 fooddetail 活动仅在我将此活动放入启动器时才起作用,但是当我尝试使用应用程序流程时..它在 foodlist 活动之后不断将页面扔回登录注册活动....根本没有logcat?意味着没有错误......为什么会这样?再次感谢...
  • 无法从您提供的代码中看出,因为没有signup-signin activity。我建议您添加一些调试日志来检查您的活动流程。很高兴我帮助您解决了NullPointerException 问题,那么为什么不将其标记为答案 :)
猜你喜欢
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多