我正在创建一个应用程序,用户可以在一些活动中输入7-10个数字值。然后在相当分层的方程式中使用条目,该方程式将结果返回给用户。有两个值给我带来麻烦,并产生了一个我无法弄清的NumberFormatException

从微调器中选择一项IHCValue,因为只有4种可能的选择:

<string-array name="ihc_choices">
    <item>0</item>
    <item>1</item>
    <item>2</item>
    <item>3</item>
</string-array>


此选择不仅可用于公式中,还可确定是否需要其他信息。

获得IHCValue:

   private void directSpinner(){

        int spinnerPosition = scoreSelect.getSelectedItemPosition();
        String[] IHC_Values = getResources().getStringArray(R.array.ihc_choices);
        String IHCValue = String.valueOf(IHC_Values[spinnerPosition]);
        SharedPrefManager.write(IHC_VALUE, IHCValue);

        //The string to manage Intent defined separately as the intent did not recognize the value of 'String IHCValue'
        String IHCEntry = scoreSelect.getSelectedItem().toString();
        if (IHCEntry.equals("2")){
            //Status equivocal, must collect more information before calculation can be performed.
            Intent next = new Intent(getApplicationContext(), FishScoreActivity.class);
            startActivity(next);
        } else { //IHCValue of 0,1,3
            //Status is defined, we have enough info to perform calculation.
            Intent last = new Intent(getApplicationContext(), CancerDemographicActivity.class);
            startActivity(last);
        }
    }


如果用户从该下拉列表中选择“ 2”,则下一个活动要求输入FISHEntry,这也在等式的一部分中使用:

获取FISHEntry:

public boolean validateData(){
    boolean validData = false;

    String FISHEntry = enterFISH.getText().toString();

    if (!FISHEntry.equals("")){
        SharedPrefManager.write(FISH_RATIO, FISHEntry);
        validData = true;
    } else {
        Toast.makeText(getApplicationContext(), "Please enter FISH ratio from your report.", Toast.LENGTH_LONG).show();
        validData = false;
    }
    return validData;
}


然后,用户可以按下按钮并运行方程式。如果用户选择的IHCValue为0.1或3,则不需要FISHEntry并且方程运行良好。

如果(且仅当)IHCValue = 2,则必须在Equation类中执行附加计算,并使应用程序崩溃。

我在应用程序中执行的步骤:


从微调器中,选择2的IHCValue
提示输入FISH分数,FISHEntry = 2.3
按下“计算”按钮:


然后该应用程序崩溃:

Caused by: java.lang.NumberFormatException: Invalid int: "2.3"
    at java.lang.Integer.invalidInt(Integer.java:138)
    at java.lang.Integer.parse(Integer.java:410)
    at java.lang.Integer.parseInt(Integer.java:367)
    at java.lang.Integer.parseInt(Integer.java:334)
    at com.them.health.Equations.MasterEquation.<clinit>
(MasterEquation.java:42)


“ 2.3”是我的FISHEntry,而第42行声明了IHCValue

MasterEquation.java:42

private static int mIHCValue = Integer.parseInt(SharedPrefManager.read(IHC_VALUE, null));


FISHEntry在MasterEquation.java:41上声明:

private static double mFISHRatio = Double.valueOf(SharedPrefManager.read(FISH_RATIO, null));


为了保持一致,将所有值保存为字符串形式的SharedPrefs,并在执行方程式时根据需要解析int或double。另外,将IHCValue直接保存为int时,我收到了String-to-Integer错误。

MasterEquation.java中的方法使用变量:

private void calcRatioOne(){

    double innerRatio = mIHCValue/mFISHRatio;

    if (mIHCValue == 0 || mIHCValue == 1){
        mRatioOne = 0.0;

    } else if (mIHCValue == 3){
        mRatioOne = 12.75525;

    } else if (mIHCValue == 2){ //IHC = 2 takes FISHEntry into account.

        if (innerRatio >= 2.2){
            mRatioOne = 12.75525;
        }
        if (innerRatio >= 1.8){
            mRatioOne = 1.46495;

        }
        if (innerRatio < 1.8){
            mRatioOne = 0.0;

        }
    }
}


private double mRatioOne;在开头定义。

我尝试了以下方法:


用户输入值时,将值以int / float的形式写入SharedPrefs。运行方程式时,错误转换为两倍。
创建了专门用于处理innerRatio计算的方法。同样的问题。
将IHCValue声明为double / float。同样的问题。
将IHCValue声明为Integer而不是int。同样的问题。


仅当IHCValue = 2时才有问题

如果有帮助,我不反对将IHC条目从微调器更改为另一种输入方法,但我想避免使用自由文本,因为这是序列中最重要的条目。

我的SharedPrefManager:

声明的密钥:

public static final String IHC_VALUE = null;


读写方式:

public static String read(String key, String defValue){
    return userPrefs.getString(key, defValue);
}

public static void write(String key, String value) {
    SharedPreferences.Editor prefsEditor = userPrefs.edit();
    prefsEditor.putString(key, value);
    prefsEditor.commit();
}

最佳答案

从错误消息中可以明显看出问题出在哪里。您试图将值“ 2.3”分配给整数类型的变量。


  最好的解决方案是使用大多数工具中提供的调试器工具。
  集成开发环境(IDE),例如IntelliJ
  Eclipse。使用该调试器工具,找出错误值的原因
  首先分配给IHCValue,并采取相应措施进行修复
  错误。


我不同意@shark的评论中提出的解决方案;将Float分配给int是不兼容的操作。我的建议是将mIHCValue的类型更改为double

如果mIHCValue必须为整数,则将其从字符串转换为双精度,然后转换为整数。像这样:

private double originalIHC = Double.valueOf(SharedPrefManager.read(IHC_VALUE, null));
private static int mIHCValue = (int) originalIHC;


让我解释为什么我分两行这样做。由于String的值不是整数,而是浮点数,因此我们必须将其解析为double first。但是无法将String转换为原始double,因此我们必须为此使用Wrapper类Double

包装器类Double(装箱)与除double以外的其他基本类型不兼容,因此我们首先将“包装”值分配给其基本类型。

将初始值转换为双基元后,我们可以将其转换为我显示的整数。

请注意,此解决方案将帮助您仅获取任何浮点数的整数部分。例如,如果mIHCValue2.82.00122.5322.9999999,则结果整数将始终是2。因此,请谨慎考虑要达到的目标。

希望这可以帮助。

07-27 16:18