【问题标题】:Arithmetic Operation算术运算
【发布时间】:2016-03-10 06:07:24
【问题描述】:

大家好,我遇到了这个问题。当我在 editText 中输入分数时,我希望应用程序在 Textview(带红色框)中生成等价物。但是应用程序会因这段代码而崩溃。

private void calculateEquivalent(){
        double x , y;
        y = Double.valueOf(total_score.toString());
        x = Double.valueOf(editScore.getText().toString());

        if (x >= y * 0.65){
            double equivalent = (Math.round((100 + (72 * (x - y)) / y)));
            String equi = String.valueOf(equivalent);
            textEquivalent.setText(equi);
        } else {
            double equivalent = (Math.round((75 + (23 * (x - y * 0.65)) / y)));
            String equi = String.valueOf(equivalent);
            textEquivalent.setText(equi);
        }
    }

【问题讨论】:

  • 请发布堆栈跟踪/错误日志
  • 错误信息是什么?也许你输入的不是数字
  • @omer727 不,先生,当应用程序崩溃时,我还没有输入任何字符或数字
  • 您的 total_score.toString()editScore.getText().toString() 字符串返回空字符串。

标签: android arithmetic-expressions


【解决方案1】:

字符串转双精度时错误为空字符串

在这段代码中

y = Double.valueOf(total_score.toString());

x = Double.valueOf(editScore.getText().toString());

可能是 total_score.toString() 或 editScore.getText().toString() 为空

total_score 变量的类型是什么

【讨论】:

  • y 有一个固定值,即 100,x 是......是的,它仍然是空的,total_score 的类型是 String
  • 您可以通过 System.out.println() 函数打印出 total_score.toString() 和 editScore.getText().toString() 的两个值。当然,两者都不是空字符串
【解决方案2】:

尝试将空字符串转换为双精度时遇到问题。您应该首先通过捕获 NumberFormatException 来检查文本字段是否为空并且不包含字符

【讨论】:

    【解决方案3】:

    正如错误日志所暗示的,在开始计算之前,您需要确保有正确的值。

    所以在调用这个函数之前你需要检查以下条件:

    try
            {
            if((total_score.toString() != null && !total_score.toString().isEmpty()) && (editScore.getText().toString()!=null && !editScore.getText().toString().isEmpty()))
                {
                    y = Double.valueOf(total_score.toString());
    
                    x = Double.valueOf(editScore.getText().toString()); //chances of getting a Numberformat exception if entered value is not a number
    
                    calculateEquivalent();
                }
            }
            catch(NumberFormatException e)
            {
            //Toast.makeText(m_context, "You entered a wrong value,Please enter only numeric values", Toast.LENGTH_SHORT).show();   
              e.printStackTrace();
            }
            catch(Throwable e)
            {
              e.printStackTrace();
            }
    

    也在你的 calculateEquivalent();方法,你需要确保 y 的值不应该为零。

    希望对你有帮助:)

    【讨论】:

      【解决方案4】:

      嘿@callmejeo,您上面编写的函数的主要问题是您将“NULL”值转换为字符串,因此您可以做的一件事就是处理异常。

       private void calculateEquivalent(){
      
             try{
                  double x , y;
                  y = Double.valueOf(total_score.toString());
                  x = Double.valueOf(editScore.getText().toString());
      
                  if (x >= y * 0.65){
                      double equivalent = (Math.round((100 + (72 * (x - y)) / y)));
                      String equi = String.valueOf(equivalent);
                      textEquivalent.setText(equi);
                  } else {
                      double equivalent = (Math.round((75 + (23 * (x - y * 0.65)) / y)));
                      String equi = String.valueOf(equivalent);
                      textEquivalent.setText(equi);
                  }
      }
         catch(Exception e){
               Toast.makeText(this,"Please Enter some value",Toast.LENGTH_LONG).show();
         }
      }
      

      【讨论】:

        【解决方案5】:

        非常感谢没有您的建议的人,我可能陷入了这个问题:) 然后我想出了这个

        @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_add_student_quiz);
        
                TextWatcher inputTextWatcher = new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        
                    }
        
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
        
                    }
        
                    @Override
                    public void afterTextChanged(Editable s) {
                        calculateEquivalent();
                    }
                };
                editScore.addTextChangedListener(inputTextWatcher);
        
            }
        
        private void calculateEquivalent(){
                try {
                    y = Double.parseDouble(total_score);
                    x = Double.parseDouble(editScore.getText().toString());
                    if (x >= y * 0.65){
                        double equivalent = (Math.round((100 + (72 * (x - y)) / y)));
                        String equi = String.valueOf(equivalent);
                        textEquivalent.setText(equi);
        
                    } else {
                        double equivalent = (Math.round((75 + (23 * (x - y * 0.65)) / y)));
                        String equi = String.valueOf(equivalent);
                        textEquivalent.setText(equi);
                    }
                }catch (Exception e){
                    Toast.makeText(getApplicationContext(), "Please Enter a Number", Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }
        
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-16
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 2012-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多