java - 按钮 onClick 后程序崩溃

标签 java android

不确定这里出了什么问题。如果编辑文本点中没有任何内容,则会发生崩溃。如果全部填写完毕就可以了。所以我的问题是 if 语句检查。即使编辑文本为空,它也会进入 if 语句。它应该跳到 else 并记录并非所有字段都已完成。

问题就在这里(我认为) - 它跳入循环,即使它不应该:

//Calculate Risk Score Button

Button calcButton = (Button) findViewById(R.id.calcButton);

calcButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        // Create and set values
        int smoker = 0;
        int medicated = 0;
        char gender = 'm';
        String selectedAge = (String) ageSpin.getSelectedItem();
        Log.i("TEST", "Before if");

        if (selectedAge != null
                && cholEdit.getText().toString() != null
                && hdlEdit.getText().toString() != null
                && sbpEdit.getText().toString() != null
                && genderGroup.getCheckedRadioButtonId() != -1
                && smokerGroup.getCheckedRadioButtonId() != -1
                && medsGroup.getCheckedRadioButtonId() != -1) {
        Log.i("TEST", "After if");

            // store values
            int age = Integer.parseInt(selectedAge.toString());
            int chol = Integer.parseInt(cholEdit.getText().toString());
            int hdl = Integer.parseInt(hdlEdit.getText().toString());
            int sbp = Integer.parseInt(sbpEdit.getText().toString());
            int genderId = genderGroup.getCheckedRadioButtonId();
            int smokeId = smokerGroup.getCheckedRadioButtonId();
            int medsId = medsGroup.getCheckedRadioButtonId();

            // Set gender, smoker and if medicated values
            if (genderId == R.id.maleR)
                gender = 'm';
            else if (genderId == R.id.femaleR)
                gender = 'f';

            if (smokeId == R.id.yesR)
                smoker = 1;
            else if (smokeId == R.id.noR)
                smoker = 0;

            if (medsId == R.id.yesR2)
                medicated = 1;
            else if (medsId == R.id.yesR2)
                medicated = 0;

            // Calculate Answer and Print
            String answer = calc.calculateRiskScore(age, gender, chol,
                    smoker, hdl, sbp, medicated);


            SharedPreferences settings = getSharedPreferences(
                    PREF_FILE, 0);
            SharedPreferences.Editor editor = settings.edit();

            editor.putInt("age", age);
            editor.putInt("chol", chol);
            editor.putInt("hdl", hdl);
            editor.putInt("sbp", sbp);
            editor.putInt("gender", genderId);
            editor.putInt("smoker", smoker);
            editor.putInt("med", medicated);
            editor.putString("risk", answer);

            editor.commit();

            displayRisk(answer);
        } else {
            Toast toast = Toast.makeText(getApplicationContext(),
                    "Not all fields are completed", Toast.LENGTH_SHORT);
            toast.show();
        }
    }
});

这是 logcat 错误。我明白错误的意思,但它不应该出现在 if 语句中:

04-22 21:26:43.920: I/TEST(22544): Before if
04-22 21:26:43.920: I/TEST(22544): After if
04-22 21:26:43.920: W/dalvikvm(22544): threadid=1: thread exiting with uncaught exception (group=0x41634438)
04-22 21:26:43.930: E/AndroidRuntime(22544): FATAL EXCEPTION: main
04-22 21:26:43.930: E/AndroidRuntime(22544): java.lang.NumberFormatException: Invalid int: ""
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.Integer.invalidInt(Integer.java:138)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.Integer.parseInt(Integer.java:359)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.Integer.parseInt(Integer.java:332)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at edu.auburn.eng.csse.comp3710.group04.CardiovascularActivity$1.onClick(CardiovascularActivity.java:83)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at android.view.View.performClick(View.java:4198)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at android.view.View$PerformClick.run(View.java:17164)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at android.os.Handler.handleCallback(Handler.java:615)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at android.os.Looper.loop(Looper.java:137)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at android.app.ActivityThread.main(ActivityThread.java:4918)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.reflect.Method.invokeNative(Native Method)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.reflect.Method.invoke(Method.java:511)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at dalvik.system.NativeStart.main(Native Method)

最佳答案

由于异常已抛出:

04-22 21:26:43.930: E/AndroidRuntime(22544): java.lang.NumberFormatException: Invalid int: ""
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.Integer.invalidInt(Integer.java:138)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.Integer.parseInt(Integer.java:359)
04-22 21:26:43.930: E/AndroidRuntime(22544):    at java.lang.Integer.parseInt(Integer.java:332)

问题是:您用来获取文本并解析 int 的 TextField 。因为这个文本字段是空的(你应该记住,空与NULL有很大不同)。 TextField 本身不为 null,但您获得的文本为空 ("")。因此,在这种情况下,Integer.parseInt 将抛出异常。 (不会像我们希望的那样自动返回 0)因此,在代码中,您必须为程序中的所有 Integer.parseInt 方法加上 try-catch block ,以防止来自用户的一些愚蠢的输入。

int chol = 0;
int hdl = 0;
int age = 0;
try {

                    age = Integer.parseInt(selectedAge.toString());
                    chol = Integer.parseInt(cholEdit.getText().toString());
                    hdl = Integer.parseInt(hdlEdit.getText().toString());

}

catch (Exception e) {
     chol = 0;
     hdl = 0;
     age = 0;
}

当您使用Integer.parseIntDouble.parseDouble时,这是最好的模式...

希望这对你有帮助:)

关于java - 按钮 onClick 后程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16159937/

相关文章:

java - Derby , XML 数据 , 长度

java - 如何从 prepareCall 方法中获取自定义 CallableStatement 对象

java - 带有 JFileChooser UI (?) 的 OS X 中的错误

android - 如何在 Xperia Android 手机上安装 apk 文件

java - 为什么 JAXB 不想验证

方法重载导致 Java 编译错误

android - 最小化android中以前 Activity 中的 Activity

android - Google Currents 喜欢逐页阅读风格

android - 使用 Jcodec 保存 rtsp h264 流(在 Android 上)

android - Android Studio 2.3 中的错误 com.android.dx.command.Main