Android Studio跨Activity传值后计算崩溃问题求助
排查Main2Activity计算kaloriseminggu时的崩溃问题
看起来你在处理从MainActivity传递过来的kaloriseminggu数据并进行除法运算时遇到了崩溃,我来帮你分析下可能的问题和修复方案:
常见崩溃原因分析
你的两个版本代码崩溃大概率是以下几种情况:
- 从Intent Bundle中获取的
kaloriseminggu值为null,或者是空字符串,或者包含非数字字符(比如带单位、标点),导致数字转换异常(NumberFormatException) - 传递的数值超出了
Integer的取值范围(第一个版本用Integer.valueOf时容易出现) - 第二个版本中直接从
TextView读取文本转换,但如果data.getString("kaloriseminggu")是null,TextView会显示字符串"null",这显然无法解析为数字
针对两个版本的修复方案
修复第一个版本代码
第一个版本用整数处理,适合kaloriseminggu是整数的场景,重点要处理null和转换异常,同时记得把计算结果设置到TextView:
package stmikbumigoramataram.simulasipemodelan; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; public class Main2Activity extends AppCompatActivity { public TextView ttkalorisehari, ttkaloriseminggu,txtbb; int naik_bb,nilai_bb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Bundle data = getIntent().getExtras(); ttkalorisehari = findViewById(R.id.tjml_kal); ttkaloriseminggu = findViewById(R.id.tjml_kal_seminggu); txtbb = findViewById(R.id.tnaik_bb); // 先检查Bundle是否为空,避免空指针 if(data == null){ Toast.makeText(this, "没有接收到数据", Toast.LENGTH_LONG).show(); return; } String kaloriHari = data.getString("kalorisehari"); String kaloriMinggu = data.getString("kaloriseminggu"); // 处理null情况,设置默认文本 ttkalorisehari.setText(kaloriHari == null ? "0" : kaloriHari); ttkaloriseminggu.setText(kaloriMinggu == null ? "0" : kaloriMinggu); try { // 直接从Bundle取字符串,避免TextView可能的格式问题 nilai_bb = Integer.parseInt(kaloriMinggu == null ? "0" : kaloriMinggu); naik_bb = nilai_bb / 7000; // 别忘了把结果设置到txtbb上!你之前的代码没做这一步 txtbb.setText(String.valueOf(naik_bb)); }catch (NumberFormatException e){ Toast.makeText(this, "kaloriseminggu格式错误:" + e.getMessage(), Toast.LENGTH_LONG).show(); txtbb.setText("0"); } } }
修复第二个版本代码
第二个版本用浮点数处理,适合需要保留小数的场景,同样要处理null和转换异常,并且尽量直接从Bundle取数据:
package stmikbumigoramataram.simulasipemodelan; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast; import java.text.DecimalFormat; public class Main2Activity extends AppCompatActivity { public TextView ttkalorisehari, ttkaloriseminggu,txtbb; double naik_bb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Bundle data = getIntent().getExtras(); ttkalorisehari = findViewById(R.id.tjml_kal); ttkaloriseminggu = findViewById(R.id.tjml_kal_seminggu); txtbb = findViewById(R.id.tnaik_bb); // 先检查Bundle是否为空 if(data == null){ Toast.makeText(this, "没有接收到数据", Toast.LENGTH_LONG).show(); return; } String kaloriHari = data.getString("kalorisehari"); String kaloriMinggu = data.getString("kaloriseminggu"); // 处理null情况 ttkalorisehari.setText(kaloriHari == null ? "0" : kaloriHari); ttkaloriseminggu.setText(kaloriMinggu == null ? "0" : kaloriMinggu); try { // 直接从Bundle获取,避免TextView的"null"字符串问题 double nilai_bb = Double.parseDouble(kaloriMinggu == null ? "0" : kaloriMinggu); DecimalFormat df = new DecimalFormat("#.##"); naik_bb = nilai_bb / 7000; txtbb.setText(df.format(naik_bb)); }catch (NumberFormatException e){ Toast.makeText(this, "kaloriseminggu格式错误:" + e.getMessage(), Toast.LENGTH_LONG).show(); txtbb.setText("0.00"); } } }
额外优化建议
建议直接传递数值而非字符串:在MainActivity中传递数据时,最好用
putInt或putDouble,而不是putString,这样避免字符串转换的问题:// MainActivity中传递数据的代码示例 Intent intent = new Intent(MainActivity.this, Main2Activity.class); intent.putExtra("kalorisehari", 1500); // 假设是整数 intent.putExtra("kaloriseminggu", 10500); startActivity(intent);然后在Main2Activity中直接取数值:
int kaloriMinggu = data.getInt("kaloriseminggu", 0); // 第二个参数是默认值检查MainActivity的传递逻辑:确保传递的键名是
kaloriseminggu,和Main2Activity中获取的键名完全一致(大小写敏感),避免因为键名不匹配导致获取到null。
内容的提问来源于stack exchange,提问作者husen
相关产品推荐
相关产品推荐

