当前位置: 首页 > 知识库问答 >
问题:

方程程序——错误似乎指向了错误的线

班高明
2023-03-14

我正在创建一个应用程序,用户在其中输入 7-10 个数值。然后,条目用于一个相当分层的公式,该公式向用户返回结果。两个值给我带来了麻烦,并产生了一个我无法弄清楚的数字格式异常

从微调器中选择一个条目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;
}

然后,用户可以按下按钮,运行方程。如果用户选择0、1或3的< code>IHCValue,则不需要< code>FISHEntry,等式运行良好。

如果(且仅当)< code>IHCValue = 2,则必须在方程类中html" target="_blank">执行额外的计算,并使应用程序崩溃。

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

  1. 从微调器中,选择 2 的 IHCValue
  2. 提示输入 FISH 分数,FISH = 2.3
  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而声明IHCValue的第42行:

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;

        }
    }
}

私人双mRatioOne是在开头定义的。

我尝试了以下方法:

  1. 当用户输入值时,将值作为int/float写入SharedPrefs。运行公式时转换为双精度时出错
  2. 创建了一个专门处理innerRatio计算的方法。同样的问题
  3. 将IHCValue声明并处理为双精度/浮点型。同样的问题
  4. 将IHCValue声明为整数,而不是int。同样的问题

只有当IHCValue = 2时,这才是一个问题

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

我的共享PrefManager:

声明的密钥:

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();
}

共有1个答案

梁丘亦
2023-03-14

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

最好的解决方案是使用调试器工具,该工具在大多数集成开发环境(IDE)中提供,如IntelliJ或Eclipse。使用该调试器工具,首先发现为什么将错误的值分配给 IHCValue,并采取相应的措施来修复错误。

我不同意@沙克在评论中提出的修复;将Float分配给int是不兼容的操作。我的建议是将mIHCValue的类型更改为

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

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

让我用两行解释一下为什么这样做。由于字符串的值不是一个整数,而是一个浮点数,我们必须首先将其解析为double。但是将一个字符串转换成基本的< code>double是不可能的,所以我们必须使用包装类< code>Double来完成这个任务。

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

在将初始值转换成double原语后,我们可以将它转换成一个整数,就像我展示的那样。

请注意,此解决方案将帮助您仅获取任何浮点数的整数部分。例如,如果 mIHCValue 为 2.8 或 2.0012 或 2.5322.9999999,则生成的整数将始终为 2所以,要小心并考虑你想要实现的目标。

希望这有帮助。

 类似资料:
  • 问题内容: 我有一种方法可以将记录插入Postgres DB中,并返回为所述记录生成的标识字段。问题是,如果我在我的POM文件中包含Redshift驱动程序,那么该驱动程序将代替Postgres驱动程序被使用- Redshift驱动程序不允许返回标识值。 代码是: 使用此POM时,它可以工作: 使用此POM时,它不起作用: 是什么让Java选择Redshift驱动程序而不是Postgres驱动程序

  • 当我试图选择通过pyenv虚拟环境创建的python bin作为解释器时,我遇到了py的问题。 我想提供更多的细节,但pycharm没有提供任何额外的输出。 更奇怪的是,我没有使用python 3.10,虚拟环境是使用python 3.8.5创建的。当使用从shell手动激活时,虚拟环境似乎也可以工作。我可以pip安装包并正确使用它们。 我正在通过flatpak安装新的pop os 20.10(u

  • 在PHPmyadmin sql框中创建存储过程时出现以下错误: 1064年的今天,您的SQL语法出现错误;请查看与您的MariaDB服务器版本对应的手册,以了解第1行“BEGIN DECLARE ref_id varchar(10)”附近使用的正确语法

  • 问题内容: 我正在比较测试程序上的两个变体。两者都在具有四个内核的计算机上以4线程运行。 在“模式1”下,我非常类似于执行程序服务来使用池。我把一堆任务扔了进去。与普通的固定线程执行器服务相比,我获得了更好的性能(即使有对Lucene的调用,该调用在其中执行了一些I / O)。 这里没有分而治之。从字面上看,我知道 在“模式2”中,我向池提交一个任务,然后在该任务中调用ForkJoinTask.i

  • 我正在使用ffmpeg将帧与一些参数连接到视频中。下面是我运行的命令示例: “FFMPEG-Y-R 24-F Image2-I”C:\用户\图片\ME\帧%04D.BMP“-Filter_complex”[0:V]选择=(n,0,76)[selected];[selected]CROP=IN_W:IN_H-60-60:0:60[cripped];[cripped]Scale=W=2CEIL(204

  • 这是一个JavaScript对象, 下面是一个代码,它通过。a和, 结果是 然而,lambda实际上只是的第二个参数,设置为,所以我认为这样应该可以工作, 或者至少是这样的 然而,它们都不起作用,都导致了这个对象: 为什么呢?这是洛达斯的一个bug吗?还是因为JavaScript的工作方式?在后一种情况下,发生了什么? 我已经找到了一个现有的问题自我答案,它为上面的代码提供了一个解决方案: 然而,