我正在创建一个应用程序,用户在其中输入 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">执行额外的计算,并使应用程序崩溃。
我在应用程序中执行的步骤:
IHCValue
。FISH = 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
而声明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
是在开头定义的。
我尝试了以下方法:
innerRatio
计算的方法。同样的问题
整数
,而不是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();
}
从错误消息中可以明显看出问题所在。您正在尝试将值“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.532
或 2.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)”附近使用的正确语法
我正在使用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
问题内容: 我正在比较测试程序上的两个变体。两者都在具有四个内核的计算机上以4线程运行。 在“模式1”下,我非常类似于执行程序服务来使用池。我把一堆任务扔了进去。与普通的固定线程执行器服务相比,我获得了更好的性能(即使有对Lucene的调用,该调用在其中执行了一些I / O)。 这里没有分而治之。从字面上看,我知道 在“模式2”中,我向池提交一个任务,然后在该任务中调用ForkJoinTask.i
这是一个JavaScript对象, 下面是一个代码,它通过。a和, 结果是 然而,lambda实际上只是的第二个参数,设置为,所以我认为这样应该可以工作, 或者至少是这样的 然而,它们都不起作用,都导致了这个对象: 为什么呢?这是洛达斯的一个bug吗?还是因为JavaScript的工作方式?在后一种情况下,发生了什么? 我已经找到了一个现有的问题自我答案,它为上面的代码提供了一个解决方案: 然而,