Android开发:跨Activity传值计算阶乘时遇崩溃求助
问题解决:Android阶乘计算程序崩溃
错误原因分析
报错信息里的Resources$NotFoundException: String resource ID #0x6是核心问题:
- TextView.setText(int)方法误用:
TextView.setText()有两个重载方法,当传入int参数时,系统会把它当作字符串资源的ID去查找,而不是直接显示数字。你传入的阶乘结果是int类型,导致系统找不到对应ID的资源,引发崩溃。 - 阶乘计算逻辑错误:循环中直接修改了变量
x(初始是输入的数值),导致循环条件i<x不断变化,会出现无限循环或者计算结果溢出的问题。
代码修正方案
1. MainActivity.java(增加输入合法性判断)
原代码未处理输入为空或非数字的情况,补充判断避免额外崩溃:
package com.example.practical6; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ EditText e1; Button b; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); e1=findViewById(R.id.editTextTextPersonName); b=findViewById(R.id.button); b.setOnClickListener(this); } @Override public void onClick(View v) { String input = e1.getText().toString().trim(); if(input.isEmpty()){ Toast.makeText(this, "请输入数值", Toast.LENGTH_SHORT).show(); return; } try { Integer number= Integer.valueOf(input); Intent i=new Intent(MainActivity.this, MainActivity2.class); i.putExtra("user",number); startActivity(i); } catch (NumberFormatException e) { Toast.makeText(this, "请输入有效整数", Toast.LENGTH_SHORT).show(); } } }
2. MainActivity2.java(核心逻辑修正)
修正setText调用方式,同时修复阶乘计算逻辑:
package com.example.practical6; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class MainActivity2 extends AppCompatActivity { TextView t; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); t=findViewById(R.id.textView2); Intent i2 = getIntent(); int inputNumber= i2.getIntExtra("user",0); // 计算阶乘,用long避免整数溢出 long factorial = 1; if(inputNumber >= 0){ for(int i=1; i<=inputNumber; i++){ factorial *= i; } } else { t.setText("负数没有阶乘"); return; } // 将数值转为字符串后设置给TextView t.setText(String.format("%d的阶乘是:%d", inputNumber, factorial)); } }
关键修改点说明
- TextView.setText():使用
String.format()或String.valueOf()将数值转为字符串,避免系统把int当成资源ID。 - 阶乘计算:
- 用
long类型存储结果,避免int类型的溢出(输入12以上的int阶乘就会溢出)。 - 循环条件改为
i<=inputNumber,用单独变量factorial存储计算结果,不修改输入数值,保证循环逻辑正确。 - 增加负数判断,给出友好提示。
- 用
内容的提问来源于stack exchange,提问作者Sneha Nadapara
相关产品推荐
相关产品推荐

