Android Studio中使用AsyncTask开发斐波那契应用崩溃求助
解决AsyncTask开发斐波那契应用崩溃问题
嗨,我帮你排查下这个应用崩溃的问题哈!看了你的代码和运行场景,主要有这几个关键点导致应用停止:
1. 未处理输入空值/无效数字,直接触发异常
当用户点击按钮时,如果输入框是空的,或者输入的不是有效数字,Double.parseDouble(Number.getText().toString())会直接抛出NumberFormatException,这是最常见的崩溃原因。
2. 结果控件未做空判断,可能触发空指针
你在onPostExecute里直接通过findViewById(R.id.editText2)获取控件,如果布局里没有这个ID的控件,或者控件初始化失败,调用setText就会触发空指针崩溃。
3. 斐波那契逻辑的边界情况处理缺失
当输入数字为1或2时,你的循环不会执行,返回结果没问题,但如果输入0或负数,逻辑会出现异常;另外用Double类型存储斐波那契数列也没必要,整数序列用Integer/Long更合适,还能避免精度问题。
4. 多余的EditText点击事件
你给输入框设置了Number.setOnClickListener(this),但onClick里并没有处理这个控件的点击逻辑,属于冗余代码,完全可以去掉。
修改后的完整代码
package com.example.asus.myapplication; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class fibonacci extends AppCompatActivity implements View.OnClickListener { private Button SolveButton; private EditText NumberInput; private EditText ResultDisplay; // 提前初始化结果控件,避免重复查找 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fibonacci); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); NumberInput = (EditText) findViewById(R.id.editText); SolveButton = (Button) findViewById(R.id.button); SolveButton.setOnClickListener(this); // 提前绑定结果控件并做空判断 ResultDisplay = (EditText) findViewById(R.id.editText2); if (ResultDisplay == null) { Toast.makeText(this, "布局中缺少结果显示控件(editText2)", Toast.LENGTH_SHORT).show(); } } @Override public void onClick(View view) { switch(view.getId()) { case R.id.button: { String inputContent = NumberInput.getText().toString().trim(); // 空输入判断 if (inputContent.isEmpty()) { Toast.makeText(this, "请输入一个正整数哦", Toast.LENGTH_SHORT).show(); return; } // 有效数字判断 int targetNum; try { targetNum = Integer.parseInt(inputContent); if (targetNum < 1) { Toast.makeText(this, "请输入大于等于1的整数", Toast.LENGTH_SHORT).show(); return; } } catch (NumberFormatException e) { Toast.makeText(this, "请输入有效的数字呀", Toast.LENGTH_SHORT).show(); return; } // 执行异步任务 new FibonacciCalculator().execute(targetNum); break; } } } // 重命名AsyncTask类,语义更清晰 public class FibonacciCalculator extends AsyncTask<Integer, Void, Long> { long num1 = 0; long num2 = 1; long num3 = 0; @Override protected Long doInBackground(Integer... params) { int n = params[0]; // 处理边界情况 if (n == 1) { return 0L; } else if (n == 2) { return 1L; } // 计算斐波那契数列 for(int k = 3; k <= n; k++) { num3 = num1 + num2; num1 = num2; num2 = num3; } return num2; } @Override protected void onPostExecute(Long result) { if (ResultDisplay != null) { String resultText = String.format("Result: %d", result); ResultDisplay.setText(resultText); } } @Override protected void onPreExecute() { // 计算前提示用户 if (ResultDisplay != null) { ResultDisplay.setText("计算中..."); } } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } } }
额外说明
- 增加了完整的输入验证,彻底避免因无效输入导致的崩溃
- 改用
Long类型存储结果,避免整数溢出(如果需要支持极大的数字,可以换成BigInteger) - 提前绑定结果控件并做空判断,防止空指针异常
- 给异步任务类重命名,代码可读性更强
内容的提问来源于stack exchange,提问作者ZARA
相关产品推荐
相关产品推荐

