我有一个问题要与你们分享我试图检查一个字符串是否不等于什么,它应该是“。”值一个字符串,如果它通过它将执行某些行代码,如果不是它只是打印的东西,但问题是当我尝试将值“。”。它崩溃了。那么有什么方法可以解决这个问题吗?
这是我的kotlin主要活动文件:
calculate.setOnClickListener {
if(((distance.text.toString().length >0) &&
(initalVelocity.text.toString().length>0) &&
(time.text.toString().length > 0)
) && (!((distance.equals(".")) &&
(initalVelocity.equals(".")) &&
(time.equals("."))))) {
val s = distance.text.toString().toDouble()
val u = initalVelocity.text.toString().toDouble()
val t = time.text.toString().toDouble()
val a = (((2* s))-(2*(u*t)))/(t*t)
answer.setText("answer $a m/(s)^2")
} else {
toast("Are u nuts !!!!")
}
LOG:
FATAL EXCEPTION: main
Process: com.a3.apurv.physicscalculator, PID: 16094
java.lang.NumberFormatException: For input string: "."
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:539)
at com.a3.apurv.physicscalculator.AccelerationIVActivity$onCreate$2.onClick(AccelerationIVActivity.kt:31)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
答案 0 :(得分:1)
问题在于您的代码的这一部分:
!((distance.equals(".")) && (initalVelocity.equals(".")) && (time.equals(".")))
如果任何字符串不等于"."
,则为真。此外,您正在比较EditText
实例而不是它的内容。你的if案件的条件应该是:
if(distance.text.toString().length > 0 &&
initalVelocity.text.toString().length > 0 &&
time.text.toString().length > 0 &&
!(distance.text.toString().equals(".") || initalVelocity.text.toString().equals(".") || time.text.toString().equals(".")))
以下是获得相同结果的另一种方法:
val s = try { distance.text.toString().toDouble() } catch(e: Exception) { null }
val u = try { initalVelocity.text.toString().toDouble() } catch(e: Exception) { null }
val t = try { time.text.toString().toDouble() } catch(e: Exception) { null }
if (s != null && u != null && t != null) {
val a = (((2* s))-(2*(u*t)))/(t*t)
answer.setText("answer $a m/(s)^2")
} else {
toast("Are u nuts !!!!")
}
我使用try-catch
代替if-else
,因为调用toDouble
和""
的{{1}}都会抛出"."
。
答案 1 :(得分:1)
您的代码失败了,因为您尝试将字符串"."
转换为数字。如果您要转换的字符串不是数字的有效表示,toDouble
(来自kotlin-stdlib
)将抛出NumberFormatException
。
文档没有说明格式是什么,所以让我们深入挖掘一下。根据{{3}}判断,这会在内部使用the source code。反过来,这会使用Double#parseDouble(String)
。如果您将用户输入视为Double值,请查看Javadoc并查看该方法的作用和时间。 "."
可能不是您允许的唯一可能导致抛出异常的输入。根据您需要在项目中支持的案例的复杂程度,您可能还需要熟悉Double#valueOf(String)
也就是说,您需要更改条件逻辑以确保"."
(或其他非数字字符串)不会转换为Double
,或者捕获{{1}抛出之后以用户友好的方式处理它。