无效的双精度:调用 EditText 时" ",但在同一方法中不从其他人打开



因此,我在尝试执行代码时会遇到一些错误。我有两个复选框可以隐藏/显示某些字段以供用户输入数据。

这是代码的片段:

public void checkBoxes(View v){
        CheckBox checkBox = (CheckBox) findViewById(R.id.IKnowInterest);
        CheckBox checkBox1 = (CheckBox) findViewById(R.id.IKnowYears);
        EditText interest = (EditText) findViewById(R.id.YearlyInterestField);
        EditText yearsToSave = (EditText) findViewById(R.id.YearsToSaveField);
        if (checkBox.isChecked()){
            interest.setVisibility(View.VISIBLE);
            yearsToSave.setVisibility(View.INVISIBLE);
        }
        if (checkBox1.isChecked()){
            interest.setVisibility(View.INVISIBLE);
            yearsToSave.setVisibility(View.VISIBLE);
        }

    }

根据wether或没有一个或另一个框,我称之为两种不同的方法(不介意此代码,我现在只是在使用这些方法):

private double iKnowYears(double M, double P, double s, double q, double n){
        double i =0;
        double A;
        n = 25;
        while(true){
            i=i+0.01;
            A = (P*(Math.pow(1+(i/q), (n*q)))) + (M*((Math.pow((1+(i/q)), (n*q) ))-1) * (q / i));
            if (((A*i)-A) >= 12*s){
                break;
            }
        }
        return i;
    }
    private double iKnowInterest(double M, double P, double s, double q, double i){
        double n = 0;
        double A;
        while(true){
            A = (P*(Math.pow(1+(i/q), (n*q)))) + (M*((Math.pow((1+(i/q)), (n*q) ))-1) * (q / i));
            if ((A*i)-A >= 12*s){
                break;
            }
            n++;
        }
        return n;
    }

现在,这是引发错误的部分:

public void moneyVsSalary(View v){
        CheckBox checkBox = (CheckBox) findViewById(R.id.IKnowInterest);
        Button button = (Button) findViewById(R.id.Calculate);
        EditText salary = (EditText) findViewById(R.id.SalaryField);
        EditText initialInvestment = (EditText) findViewById(R.id.InitialInvestmentField);
        EditText monthlyInvestment = (EditText) findViewById(R.id.MonthlyDepositField);
        EditText interest = (EditText) findViewById(R.id.YearlyInterestField);
        EditText yearsToSave = (EditText) findViewById(R.id.YearsToSaveField);
        double s = Double.parseDouble(salary.getText().toString());
        double P = Double.parseDouble(initialInvestment.getText().toString());
        double M = Double.parseDouble(monthlyInvestment.getText().toString());
        double q = 12;
        double n = Double.parseDouble(yearsToSave.getText().toString());
        double i = Double.parseDouble(interest.getText().toString())/100;
        //Checks if either interest och year checkboxes are checked.
        if (checkBox.isChecked()){
            button.setText(Double.toString(iKnowInterest(M, P, s, q, i)) + " years");
        }
        else{
            button.setText(Double.toString(iKnowYears(M, P, s, q, n)) + " % per year");
        }
    }

根据检查的框,丢弃错误的是double n = Double.parseDouble(yearsToSave.getText().toString());double i = Double.parseDouble(interest.getText().toString())/100;

我一直在试图弄清楚为什么当其余的语句没有时会出现错误。这是XML部分的代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.segmeier.financecalc.SalaryVSMoneyYield"
    android:nestedScrollingEnabled="false">
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/SalaryField"
        android:layout_centerHorizontal="true"
        android:hint="@string/salary_today"
        android:layout_marginTop="200dp" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/InitialInvestmentField"
        android:layout_below="@+id/SalaryField"
        android:hint="@string/starting_amount"
        android:layout_centerHorizontal="true" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/MonthlyDepositField"
        android:layout_below="@+id/InitialInvestmentField"
        android:hint="@string/monthly_installments"
        android:layout_centerHorizontal="true" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/YearlyInterestField"
        android:layout_below="@+id/YearsToSaveField"
        android:hint="@string/interest_per_year"
        android:layout_centerHorizontal="true"
        android:visibility="invisible"/>
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"
        android:ems="10"
        android:id="@+id/YearsToSaveField"
        android:layout_below="@+id/MonthlyDepositField"
        android:hint="@string/years_to_save"
        android:layout_centerHorizontal="true"
        android:visibility="invisible"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/calculate"
        android:id="@+id/Calculate"
        android:layout_below="@+id/YearlyInterestField"
        android:layout_margin="10dp"
        android:layout_centerHorizontal="true"
        android:onClick="moneyVsSalary" />
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/iknowhowmanyyearsIWantToSave"
        android:id="@+id/IKnowYears"
        android:layout_above="@+id/InitialInvestmentField"
        android:layout_marginBottom="50dp"
        android:layout_alignLeft="@+id/InitialInvestmentField"
        android:layout_alignRight="@+id/InitialInvestmentField"
        android:checked="false"
        android:onClick="checkBoxes"/>
    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/IKnowInterest"
        android:id="@+id/IKnowInterest"
        android:layout_above="@+id/IKnowYears"
        android:layout_marginBottom="1dp"
        android:layout_alignLeft="@+id/InitialInvestmentField"
        android:layout_alignRight="@+id/InitialInvestmentField"
        android:checked="false"
        android:onClick="checkBoxes"/>

</RelativeLayout >

任何帮助都非常感谢!

JTextField兴趣或年度赛车是空的,具体取决于复选框,因此仅在检查复选框时才获得相关值。这样更改您的代码:

 //Checks if either interest och year checkboxes are checked.
 if (checkBox.isChecked()) {
     double i = Double.parseDouble(interest.getText().toString())/100;
     button.setText(Double.toString(iKnowInterest(M, P, s, q, i)) + " years");
 } else {
     double n = Double.parseDouble(yearsToSave.getText().toString());
     button.setText(Double.toString(iKnowYears(M, P, s, q, n)) + " % per year");
 }

Double.parseDouble(...)在传递的字符串中找不到双重时会引发异常。


根据Java Docs(https://docs.oracle.com/javase/7/docs/api/java/java/lang/lang/double.html#parsedoubledoubboup(java.lang.lang.string))),Double.parseDouble(String)可以投掷以下以下两个例外:

nullpoInterException-如果字符串为null

numberFormateXception-如果字符串不包含可泊的双重。


我建议您在调用这两行抛出异常之前检查传递的字符串是空的还是空的。

相关内容

最新更新