如何检查该字符串是否不等于一个字符串然后它将工作,否则没有?在kotlin

时间:2018-01-01 14:16:01

标签: android kotlin

我有一个问题要与你们分享我试图检查一个字符串是否不等于什么,它应该是“。”值一个字符串,如果它通过它将执行某些行代码,如果不是它只是打印的东西,但问题是当我尝试将值“。”。它崩溃了。那么有什么方法可以解决这个问题吗?

这是我的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)

2 个答案:

答案 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}抛出之后以用户友好的方式处理它。