Android 致命异常:Java.lang.NumberFormatException:用于输入字符串&引用;

Android 致命异常:Java.lang.NumberFormatException:用于输入字符串&引用;,android,if-statement,android-edittext,runtime-error,parseint,Android,If Statement,Android Edittext,Runtime Error,Parseint,我面临致命的异常,它导致我的应用程序崩溃。 代码在这里 int datedob=Integer.parseInt(dobdate.getText().toString()); if(datedob>31) dobdate.setError("invalid"); 我还在学习Android studio编程,所以请帮助我。 我的edittext dobdate已经是“数字”类型。如果应用良好的编程实践,应该能够避免此问题。首先,致命错误将使您的程序崩溃,因此,您希望不惜一切代价避

我面临致命的异常,它导致我的应用程序崩溃。 代码在这里

int datedob=Integer.parseInt(dobdate.getText().toString());
if(datedob>31)
     dobdate.setError("invalid");
我还在学习Android studio编程,所以请帮助我。
我的edittext dobdate已经是“数字”类型。

如果应用良好的编程实践,应该能够避免此问题。首先,致命错误将使您的程序崩溃,因此,您希望不惜一切代价避免这种情况。为此,您应该尝试“捕获”错误。下面的示例捕获NumberFormatException。如果发生错误,则将执行“catch”代码块,并将错误打印到日志文件中

但是,我们应该首先检查字符串,然后再尝试将其转换为int。因此,首先将其读入字符串变量,然后去掉任何空格,然后检查字符串是否为空,然后才尝试将其转换为int

在“if”代码块周围使用大括号也是一种很好的形式。如果不这样做,则只能编写一条指令,但通常情况下,可能需要添加多条指令,因此,始终使用它们,即使只针对一条指令。它使哪个代码是块的一部分更为明显

int datedob = 0;
string sdatedob = dobdate.getText().toString();
sdatedob = sdatedob.replace(" ", "");

if (sdatedob.length() > 0) {

    try {
        datedob = Integer.parseInt(sdatedob);
        if(datedob>31) {
            dobdate.setError("invalid");
        }
    } catch (NumberFormatException e) {
      Log.e("MyApp", e.getLocalizedMessage());
    }

} else {
    Log.w("MyApp", "dobdate is empty");
}
错误的线索出现在标题中的异常消息中:致命异常:Java.lang.NumberFormatException:For input string“”

您的字符串中包含空格。空格不是有效的int,因此,这就是导致异常的原因。因此,我们应该在解析为int之前删除所有空格。但是,由于这是字符串包含的全部内容,因此在删除空格后,字符串的长度将为零,也不是有效的int,并且还会导致异常。因此,在尝试将字符串解析为int之前,您需要检查每种情况。这允许您以不同的方式处理每种情况,因此,您可能希望向用户提供一条消息,说明其datedob为空,或者其中包含非数字字符,这将非常有用。不确定edittext如何在其中获得一个空格(如果格式化为数字),但原始异常消息显示确实如此


至于e.getLocalizedMessage(),它是每个不同类型异常的一部分,其中包含异常原因的解释。它与e.getMessage()相同,只是如果消息中有任何日期或数字格式,则getLocalizedMessage()方法将为设备上活动的位置设置这些格式,因此,对于用户或调试日志来说,它可能是一条更可读的消息。

您能为您的问题提供更多的上下文吗,显然,
不是有效的整数。谢谢,先生:)。但我想在我的代码中询问为什么会发生这种情况,为什么要替换“”,以及e.getLocalizedMessage()的含义是什么。再次感谢你。我不希望我的问题只在10分钟内解决。请参阅上面的编辑。