My Simple Interest计算器因空指针异常错误而崩溃

时间:2015-02-26 23:33:36

标签: java android logcat

My Simple Interest计算器崩溃时出现空指针异常错误,不确定问题是什么,在我编译之前IDE中没有错误,这对我来说是新的。这是我的代码和logcat:编辑:我不能发布一个logcat,因为编辑认为它是代码,我无法正确格式化 代码:

package com.codeherenow.sicalculator;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.SeekBar;

public class SICalculatorActivity extends Activity
    implements SeekBar.OnSeekBarChangeListener, View.OnClickListener{
private int years;
private TextView YT;
private SeekBar bar;
private EditText principal = (EditText) findViewById(R.id.PA_field);
private EditText interest = (EditText) findViewById(R.id.IR_field);
public EditText pvalue;
public EditText ivalue;
private double mPvalue = 0;
private double mIvalue = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sicalculator);
    bar = (SeekBar)findViewById(R.id.seekBar);
    bar.setOnSeekBarChangeListener(this);
    pvalue = (EditText) principal.getText();
    ivalue = (EditText) interest.getText();
    String s = principal.getText().toString();
    mPvalue = Double.parseDouble(s);
    String s2 = interest.getText().toString();
    mIvalue = Double.parseDouble(s2);

}
    @Override
    public void onProgressChanged (SeekBar seekBar,int i, boolean b){
        years = i;
        YT = (TextView) findViewById(R.id.Years);
        YT.setText(years + " Year(s)");

    }

    @Override
    public void onStartTrackingTouch (SeekBar seekBar){

    }

    @Override
    public void onStopTrackingTouch (SeekBar seekBar){

    }

@Override
public void onClick(View view) {
    TextView fTextView = (TextView) findViewById(R.id.finalText);
    double finValue = mPvalue * (mIvalue/100) * years;
    fTextView.setText("The interest for " + pvalue + "at a rate of " +    ivalue + "for " + years + "year(s) is " + finValue);
}
}

1 个答案:

答案 0 :(得分:2)

您可以通过调用findViewById来实例化视图变量,因为您正在声明它们。您必须先声明它们,然后在onCreate中实例化,或者在Activity与视图绑定后调用某个方法。请务必在setContentView(R.layout.sicalculator);

之后执行此操作

好的,在看到你的布局,堆栈跟踪和更多地阅读你的代码之后,我发现有一些基本的问题应该给你更多的崩溃,所以让我们解决它们。

首先,pvalueivalue变量是不必要的!删除它们。 相关:您无法将Editable分配给EditText。因此,此行无效ivalue = (EditText) interest.getText();因为getText()返回Editable。但无论如何,这些都是多余的和不必要的。

其次,在onCreate方法中,让我们只是初始化视图而不是尝试获取值并解析它们;用户(或您)尚未进行交互,也未输入任何值;因此,尝试将空值解析为双打将使您的应用程序崩溃。 你的onCreate方法看起来应该是这样的。 (请注意,我也在初始化您的按钮并在此处设置点击监听器。)

@Override
protected void onCreate(Bundle savedInstanceState)
{
  super.onCreate(savedInstanceState);
  setContentView(R.layout.sicalculator);
  principal = (EditText) findViewById(R.id.PA_field);
  interest =  (EditText) findViewById(R.id.IR_field);
  bar = (SeekBar) findViewById(R.id.seekBar);
  bar.setOnSeekBarChangeListener(this);
  calcBtn = (Button)findViewById(R.id.calc_btn);
  calcBtn.setOnClickListener(this);
}

现在,您应该获取值并在onClick侦听器中解析它们 - 仅当用户输入值并单击Calculate按钮时,因此onClick()方法应如下所示:

@Override
public void onClick(View view)
{
  TextView fTextView = (TextView) findViewById(R.id.finalText);
  mPvalue = Double.valueOf(principal.getText().toString());
  mIvalue = Double.valueOf(interest.getText().toString());

  double finValue = mPvalue * (mIvalue / 100) * years;
  fTextView.setText("The interest for " + mPvalue + "at a rate of " + mIvalue + "for " + years + "year(s) is " + finValue);
}

这应该清除逻辑和顺序,或者声明,初始化,从变量中检索值。我希望这能解释Java和Android基础知识的工作原理。

哦,顺便说一下,我实际上运行了代码并且它在我的手机上运行,​​所以这不是我的头脑。如果这对您有帮助,请接受答案。

祝福,