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);
}
}
答案 0 :(得分:2)
您可以通过调用findViewById来实例化视图变量,因为您正在声明它们。您必须先声明它们,然后在onCreate中实例化,或者在Activity与视图绑定后调用某个方法。请务必在setContentView(R.layout.sicalculator);
好的,在看到你的布局,堆栈跟踪和更多地阅读你的代码之后,我发现有一些基本的问题应该给你更多的崩溃,所以让我们解决它们。
首先,pvalue
和ivalue
变量是不必要的!删除它们。
相关:您无法将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基础知识的工作原理。
哦,顺便说一下,我实际上运行了代码并且它在我的手机上运行,所以这不是我的头脑。如果这对您有帮助,请接受答案。
祝福,