Android Studio点击按钮时App崩溃问题求助
崩溃根因
你的应用崩溃是空指针异常(NullPointerException) 导致的,核心错误出在控件初始化逻辑:
- 你声明的
Button cAdd、EditText cname两个控件变量默认值是null,没有完成实例化 - 你写的
cname.findViewById(R.id.CName)、cAdd.findViewById(R.id.cAdd)逻辑完全错误:findViewById()是Activity提供的方法,需要调用Activity的这个方法拿到控件实例,再赋值给你声明的变量,而不是用空的控件对象去调用findViewById。 - 移除控件初始化代码后不崩溃,也侧面印证了崩溃点就在这部分——后续你调用
cAdd.setOnClickListener()、cname.getText()的时候,操作的都是null对象,直接触发崩溃。
修复方案
- 修正控件初始化的写法,把onCreate里的两行错误初始化代码替换成正确的赋值逻辑
- 补上Firebase操作的失败回调,避免出错时加载弹窗一直卡住无法关闭
- (规范建议)按照Java命名规则,将类名
add改为大驼峰格式的AddActivity,避免后续混淆、清单文件注册出现隐性问题
修复后完整代码
package com.example.getorganized; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import java.util.HashMap; public class add extends AppCompatActivity { private FirebaseAuth firebaseAuth; private ProgressDialog progressDialo; Button cAdd; EditText cname; String category = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add); firebaseAuth = FirebaseAuth.getInstance(); progressDialo =new ProgressDialog(this); progressDialo.setTitle("Please wait"); progressDialo.setCanceledOnTouchOutside(false); // 修正:调用Activity的findViewById方法,将返回的控件实例赋值给变量 cname = findViewById(R.id.CName); cAdd = findViewById(R.id.cAdd); cAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { vaildateData(); } }); } private void vaildateData() { category = cname.getText().toString().trim(); if(category.isEmpty()){ cname.setError("Enter name of Category"); } else{ addTo(); } } private void addTo() { progressDialo.setMessage("Adding category..."); progressDialo.show(); long timestamp = System.currentTimeMillis(); HashMap<String, Object> hashMap = new HashMap<>(); hashMap.put("id", "" +timestamp); hashMap.put("category", ""+category); hashMap.put("timestamp", timestamp); hashMap.put("uid", ""+ firebaseAuth.getUid()); DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Categories"); ref.child(""+timestamp).setValue(hashMap) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void unused) { progressDialo.dismiss(); Toast.makeText(add.this, "Category added successfully", Toast.LENGTH_LONG).show(); } }) // 补上失败回调,避免出错时弹窗卡死 .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { progressDialo.dismiss(); Toast.makeText(add.this, "Add failed: "+e.getMessage(), Toast.LENGTH_SHORT).show(); } }); } }
补充说明:替换代码后先确认
activity_add.xml布局里确实存在id为CName的EditText控件、id为cAdd的Button控件,id拼写完全一致才不会出现找不到控件的问题。
内容的提问来源于stack exchange,提问作者UserRW
相关产品推荐
相关产品推荐

