gpt4 book ai didi

java - 我的单利计算器因空指针异常错误而崩溃

转载 作者:行者123 更新时间:2023-12-02 04:56:08 25 4
gpt4 key购买 nike

我的单利计算器因空指针异常错误而崩溃,不确定问题是什么,在编译之前 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);
}
}

最佳答案

您无法在声明 View 变量时通过调用 findViewById 来实例化它们。您必须首先声明它们,然后在 onCreate 中或在 Activity 与 View 绑定(bind)后调用的某个方法中实例化它们。确保在 setContentView(R.layout.sicalculator);

之后执行此操作

好吧,在查看了您的布局、堆栈跟踪并阅读了更多代码之后,我发现存在一些基本问题,这些问题应该会导致更多崩溃,所以让我们修复它们。

首先,pvalueivalue 变量是不必要的!删除它们。相关:您不能将 Editable 分配给 EditText。所以这一行是无效的ivalue = (EditText)interest.getText();因为getText()返回一个Editable。但这些都是多余的,没有必要。

其次,在 onCreate 方法中,我们只初始化 View ,而不是尝试获取值并解析它们;用户(或您)尚未进行交互或输入任何值;因此尝试将空值解析为 double 将使您的应用程序崩溃。您的 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 监听器中解析它们 - 仅当用户输入值并单击“计算”按钮时,因此您的 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 基础知识是如何工作的。

哦,顺便说一句,我实际上运行了代码并且它在我的手机上运行,​​所以这不仅仅是我的想法。

关于java - 我的单利计算器因空指针异常错误而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com