简体   繁体   中英

I'm getting a NaN value when pressing the button in my app, could someone point out why?

This is my Java code:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
private double counter;
private double sum = 0;
private String value;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.Button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
            TextView textGemiddelde = (TextView) 
findViewById(R.id.Gemiddelde);
            textGemiddelde.append(calculate());
        }
    });
}

public double sum() {

    EditText EditText1 = (EditText) findViewById(R.id.EditText1);
    double cijfer1 = Double.valueOf(EditText1.getText().toString());

    EditText EditText2 = (EditText) findViewById(R.id.EditText2);
    double cijfer2 = Double.valueOf(EditText2.getText().toString());

    EditText EditText3 = (EditText) findViewById(R.id.EditText3);
    double cijfer3 = Double.valueOf(EditText3.getText().toString());

    EditText EditText4 = (EditText) findViewById(R.id.EditText4);
    double cijfer4 = Double.valueOf(EditText4.getText().toString());

    EditText EditText5 = (EditText) findViewById(R.id.EditText5);
    double cijfer5 = Double.valueOf(EditText5.getText().toString());

    EditText EditText6 = (EditText) findViewById(R.id.EditText6);
    double cijfer6 = Double.valueOf(EditText6.getText().toString());

    EditText EditText7 = (EditText) findViewById(R.id.EditText7);
    double cijfer7 = Double.valueOf(EditText7.getText().toString());

    EditText EditText8 = (EditText) findViewById(R.id.EditText8);
    double cijfer8 = Double.valueOf(EditText8.getText().toString());

    EditText EditText9 = (EditText) findViewById(R.id.EditText9);
    double cijfer9 = Double.valueOf(EditText9.getText().toString());

    EditText EditText10 = (EditText) findViewById(R.id.EditText10);
    double cijfer10 = Double.valueOf(EditText10.getText().toString());


    EditText EditText_1 = (EditText) findViewById(R.id.EditText_1);
    double weging1 = Double.valueOf(EditText_1.getText().toString());

    EditText EditText_2 = (EditText) findViewById(R.id.EditText_2);
    double weging2 = Double.valueOf(EditText_2.getText().toString());

    EditText EditText_3 = (EditText) findViewById(R.id.EditText_3);
    double weging3 = Double.valueOf(EditText_3.getText().toString());

    EditText EditText_4 = (EditText) findViewById(R.id.EditText_4);
    double weging4 = Double.valueOf(EditText_4.getText().toString());

    EditText EditText_5 = (EditText) findViewById(R.id.EditText_5);
    double weging5 = Double.valueOf(EditText_5.getText().toString());

    EditText EditText_6 = (EditText) findViewById(R.id.EditText_6);
    double weging6 = Double.valueOf(EditText_6.getText().toString());

    EditText EditText_7 = (EditText) findViewById(R.id.EditText_7);
    double weging7 = Double.valueOf(EditText_7.getText().toString());

    EditText EditText_8 = (EditText) findViewById(R.id.EditText_8);
    double weging8 = Double.valueOf(EditText_8.getText().toString());

    EditText EditText_9 = (EditText) findViewById(R.id.EditText_9);
    double weging9 = Double.valueOf(EditText_9.getText().toString());

    EditText EditText_10 = (EditText) findViewById(R.id.EditText_10);
    double weging10 = Double.valueOf(EditText_10.getText().toString());


    if(!TextUtils.isEmpty(EditText1.getText().toString()) && 
!TextUtils.isEmpty(EditText_1.getText().toString())) {
        this.sum += cijfer1 * weging1;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText2.getText().toString()) && 
!TextUtils.isEmpty(EditText_2.getText().toString())) {
        this.sum += cijfer2 * weging2;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText3.getText().toString()) && 
!TextUtils.isEmpty(EditText_3.getText().toString())) {
        this.sum += cijfer3 * weging3;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText4.getText().toString()) && 
!TextUtils.isEmpty(EditText_4.getText().toString())) {
        this.sum += cijfer4 * weging4;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText5.getText().toString()) && 
!TextUtils.isEmpty(EditText_5.getText().toString())) {
        this.sum += cijfer5 * weging5;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText6.getText().toString()) && 
!TextUtils.isEmpty(EditText_6.getText().toString())) {
        this.sum += cijfer6 * weging6;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText7.getText().toString()) && 
!TextUtils.isEmpty(EditText_7.getText().toString())) {
        this.sum += cijfer7 * weging7;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText8.getText().toString()) && 
!TextUtils.isEmpty(EditText_8.getText().toString())) {
        this.sum += cijfer8 * weging8;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText9.getText().toString()) && 
!TextUtils.isEmpty(EditText_9.getText().toString())) {
        this.sum += cijfer9 * weging9;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText10.getText().toString()) && !TextUtils.isEmpty(EditText_10.getText().toString())) {
        this.sum += cijfer10 * weging10;
        this.counter++;
    } else {

    }

    return sum;
}

public double average() {
    return sum / counter;
}

public String calculate() {
    value = String.valueOf(average());
    return value;
}

}

This will be my first app so excuse me for messy code. What it basically does is as follows: the app has 10 input fields where you can enter a number and 10 fields to enter the weight of that number. If you click on the bottom button, it will calculate the average of the entered numbers + weight. Currently, when I click on the button, the following gets appended to "textGemiddelde" (which is Dutch for average): NaN. I'd really appreciate it if someone could point out to me why I get this code and not the average of the given numbers + weight.

您不调用sum()方法,并且变量counter未初始化。

NaN occurred because you were trying to compute 0/0. Also, counter is not initialized. I have corrected it. Tell if it works or not.

public class MainActivity extends AppCompatActivity {
private double counter = 0;
private double sum = 0;
private String value;
TextView textGemiddelde;
EditText EditText1;
EditText EditText2;
EditText EditText3;
EditText EditText4;
EditText EditText5;
EditText EditText6;
EditText EditText7;
EditText EditText8;
EditText EditText9;
EditText EditText10;
EditText EditText_1;
EditText EditText_2;
EditText EditText_3;
EditText EditText_4;
EditText EditText_5;
EditText EditText_6;
EditText EditText_7;
EditText EditText_8;
EditText EditText_9;
EditText EditText_10;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EditText1 = (EditText) findViewById(R.id.EditText1);

    EditText2 = (EditText) findViewById(R.id.EditText2);

    EditText3 = (EditText) findViewById(R.id.EditText3);

    EditText4 = (EditText) findViewById(R.id.EditText4);

    EditText5 = (EditText) findViewById(R.id.EditText5);

    EditText6 = (EditText) findViewById(R.id.EditText6);

    EditText7 = (EditText) findViewById(R.id.EditText7);

    EditText8 = (EditText) findViewById(R.id.EditText8);

    EditText9 = (EditText) findViewById(R.id.EditText9);

    EditText10 = (EditText) findViewById(R.id.EditText10);

    EditText_1 = (EditText) findViewById(R.id.EditText_1);

    EditText_2 = (EditText) findViewById(R.id.EditText_2);

    EditText_3 = (EditText) findViewById(R.id.EditText_3);

    EditText_4 = (EditText) findViewById(R.id.EditText_4);

    EditText_5 = (EditText) findViewById(R.id.EditText_5);

    EditText_6 = (EditText) findViewById(R.id.EditText_6);

    EditText_7 = (EditText) findViewById(R.id.EditText_7);

    EditText_8 = (EditText) findViewById(R.id.EditText_8);

    EditText_9 = (EditText) findViewById(R.id.EditText_9);

    EditText_10 = (EditText) findViewById(R.id.EditText_10);

    textGemiddelde = (TextView)
            findViewById(R.id.Gemiddelde);
    Button button = (Button) findViewById(R.id.Button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
           sum = sum();
            textGemiddelde.append(calculate());
        }
    });
}

public double sum() {

    sum = 0;
    counter = 0;
    double cijfer1 = ParseDouble(EditText1.getText().toString());


    double cijfer2 = ParseDouble(EditText2.getText().toString());


    double cijfer3 = ParseDouble(EditText3.getText().toString());


    double cijfer4 = ParseDouble(EditText4.getText().toString());


    double cijfer5 = ParseDouble(EditText5.getText().toString());


    double cijfer6 = ParseDouble(EditText6.getText().toString());


    double cijfer7 = ParseDouble(EditText7.getText().toString());


    double cijfer8 = ParseDouble(EditText8.getText().toString());


    double cijfer9 = ParseDouble(EditText9.getText().toString());


    double cijfer10 = ParseDouble(EditText10.getText().toString());


    double weging1 = ParseDouble(EditText_1.getText().toString());


    double weging2 = ParseDouble(EditText_2.getText().toString());

    double weging3 = ParseDouble(EditText_3.getText().toString());

    double weging4 = ParseDouble(EditText_4.getText().toString());

    double weging5 = ParseDouble(EditText_5.getText().toString());

    double weging6 = ParseDouble(EditText_6.getText().toString());

    double weging7 = ParseDouble(EditText_7.getText().toString());

    double weging8 = ParseDouble(EditText_8.getText().toString());

    double weging9 = ParseDouble(EditText_9.getText().toString());

    double weging10 = ParseDouble(EditText_10.getText().toString());


    if(!TextUtils.isEmpty(EditText1.getText().toString()) &&
            !TextUtils.isEmpty(EditText_1.getText().toString())) {
        this.sum += cijfer1 * weging1;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText2.getText().toString()) &&
            !TextUtils.isEmpty(EditText_2.getText().toString())) {
        this.sum += cijfer2 * weging2;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText3.getText().toString()) &&
            !TextUtils.isEmpty(EditText_3.getText().toString())) {
        this.sum += cijfer3 * weging3;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText4.getText().toString()) &&
            !TextUtils.isEmpty(EditText_4.getText().toString())) {
        this.sum += cijfer4 * weging4;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText5.getText().toString()) &&
            !TextUtils.isEmpty(EditText_5.getText().toString())) {
        this.sum += cijfer5 * weging5;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText6.getText().toString()) &&
            !TextUtils.isEmpty(EditText_6.getText().toString())) {
        this.sum += cijfer6 * weging6;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText7.getText().toString()) &&
            !TextUtils.isEmpty(EditText_7.getText().toString())) {
        this.sum += cijfer7 * weging7;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText8.getText().toString()) &&
            !TextUtils.isEmpty(EditText_8.getText().toString())) {
        this.sum += cijfer8 * weging8;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText9.getText().toString()) &&
            !TextUtils.isEmpty(EditText_9.getText().toString())) {
        this.sum += cijfer9 * weging9;
        this.counter++;
    } else {

    }

    if(!TextUtils.isEmpty(EditText10.getText().toString()) && !TextUtils.isEmpty(EditText_10.getText().toString())) {
        this.sum += cijfer10 * weging10;
        this.counter++;
    } else {

    }

    return sum;
}

public double average() {
    if(couter == 0) return -1;
    return sum / counter;
}

public String calculate() {
    value = String.valueOf(average());
    return value;
}
double ParseDouble(String strNumber) {
    if (strNumber != null && strNumber.length() > 0) {
        try {
            return Double.parseDouble(strNumber);
        } catch(Exception e) {
            return -1;   // or some value to mark this field is wrong. or make a function validates field first ...
        }
    }
    else return 0;
}

}

You need to call sum() method so that the sum and counter variables have the values. In the current code, they are 0 as the sum() method is not called. So, 0/0 returns NaN. Also, you need to reset the values of sum and counter every time the button is clicked. Or else these values will get added up every time as these are the field variables. Also, you don't have to use findViewById every time in the sum() method. Just initialize it once in the onCreate and it will serve the purpose, as this operation is the heavy one. For quick fix change the average methods by:

public double average() {
    sum = 0;
    counter = 0;
    sum();
    return sum / counter;
}

This will work.

But to make the code neat and good, you can write the class as:

class MainActivity extends AppCompatActivity {

private double counter;
private double sum = 0;
private String value;
private EditText mEditText1;
private EditText mEditText2;
private EditText mEditText3;
private EditText mEditText4;
private EditText mEditText5;
private EditText mEditText6;
private EditText mEditText7;
private EditText mEditText8;
private EditText mEditText9;
private EditText mEditText10;
private EditText mEditText_1;
private EditText mEditText_2;
private EditText mEditText_3;
private EditText mEditText_4;
private EditText mEditText_5;
private EditText mEditText_6;
private EditText mEditText_7;
private EditText mEditText_8;
private EditText mEditText_9;
private EditText mEditText_10;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.Button);
    mEditText1 = (EditText) findViewById(R.id.EditText1);
    mEditText2 = (EditText) findViewById(R.id.EditText2);
    mEditText3 = (EditText) findViewById(R.id.EditText3);
    mEditText4 = (EditText) findViewById(R.id.EditText4);
    mEditText5 = (EditText) findViewById(R.id.EditText5);
    mEditText6 = (EditText) findViewById(R.id.EditText6);
    mEditText7 = (EditText) findViewById(R.id.EditText7);
    mEditText8 = (EditText) findViewById(R.id.EditText8);
    mEditText9 = (EditText) findViewById(R.id.EditText9);
    mEditText10 = (EditText) findViewById(R.id.EditText10);

    mEditText_1 = (EditText) findViewById(R.id.EditText_1);
    mEditText_2 = (EditText) findViewById(R.id.EditText_2);
    mEditText_3 = (EditText) findViewById(R.id.EditText_3);
    mEditText_4 = (EditText) findViewById(R.id.EditText_4);
    mEditText_5 = (EditText) findViewById(R.id.EditText_5);
    mEditText_6 = (EditText) findViewById(R.id.EditText_6);
    mEditText_7 = (EditText) findViewById(R.id.EditText_7);
    mEditText_8 = (EditText) findViewById(R.id.EditText_8);
    mEditText_9 = (EditText) findViewById(R.id.EditText_9);
    mEditText_10 = (EditText) findViewById(R.id.EditText_10);

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // handle click
            TextView textGemiddelde = (TextView)
                    findViewById(R.id.Gemiddelde);
            textGemiddelde.append(calculate());
        }
    });
}

public double sum() {

    sum = 0;
    counter = 0;

    double cijfer1 = Double.valueOf(mEditText1.getText().toString());
    double cijfer2 = Double.valueOf(mEditText2.getText().toString());
    double cijfer3 = Double.valueOf(mEditText3.getText().toString());
    double cijfer4 = Double.valueOf(mEditText4.getText().toString());
    double cijfer5 = Double.valueOf(mEditText5.getText().toString());
    double cijfer6 = Double.valueOf(mEditText6.getText().toString());
    double cijfer7 = Double.valueOf(mEditText7.getText().toString());
    double cijfer8 = Double.valueOf(mEditText8.getText().toString());
    double cijfer9 = Double.valueOf(mEditText9.getText().toString());
    double cijfer10 = Double.valueOf(mEditText10.getText().toString());

    double weging1 = Double.valueOf(mEditText_1.getText().toString());
    double weging2 = Double.valueOf(mEditText_2.getText().toString());
    double weging3 = Double.valueOf(mEditText_3.getText().toString());
    double weging4 = Double.valueOf(mEditText_4.getText().toString());
    double weging5 = Double.valueOf(mEditText_5.getText().toString());
    double weging6 = Double.valueOf(mEditText_6.getText().toString());
    double weging7 = Double.valueOf(mEditText_7.getText().toString());
    double weging8 = Double.valueOf(mEditText_8.getText().toString());
    double weging9 = Double.valueOf(mEditText_9.getText().toString());
    double weging10 = Double.valueOf(mEditText_10.getText().toString());


    if (cijfer1 != 0 && weging1 != 0) {
        this.sum += cijfer1 * weging1;
        this.counter++;
    }

    if (cijfer2 != 0 && weging2 != 0) {
        this.sum += cijfer2 * weging2;
        this.counter++;
    }

    if (cijfer3 != 0 && weging3 != 0) {
        this.sum += cijfer3 * weging3;
        this.counter++;
    }

    if (cijfer4 != 0 && weging4 != 0) {
        this.sum += cijfer4 * weging4;
        this.counter++;
    }

    if (cijfer5 != 0 && weging5 != 0) {
        this.sum += cijfer5 * weging5;
        this.counter++;
    }

    if (cijfer6 != 0 && weging6 != 0) {
        this.sum += cijfer6 * weging6;
        this.counter++;
    }

    if (cijfer7 != 0 && weging7 != 0) {
        this.sum += cijfer7 * weging7;
        this.counter++;
    }

    if (cijfer8 != 0 && weging8 != 0) {
        this.sum += cijfer8 * weging8;
        this.counter++;
    }

    if (cijfer9 != 0 && weging9 != 0) {
        this.sum += cijfer9 * weging9;
        this.counter++;
    }

    if (cijfer10 != 0 && weging10 != 0) {
        this.sum += cijfer10 * weging10;
        this.counter++;
    }
    return sum;
}

public String calculate() {
    sum = 0;
    counter = 0;
    sum();
    if (counter != 0)
        value = String.valueOf(sum / counter);
    else
        value = "Invalid Input";
    return value;
}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM