我的名字是Deepak Sharma,我正面临致命的意外,它导致我的应用程序崩溃。代码在这里
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");
}
错误的线索在于标题中的异常消息:FATAL EXCEPTION:Java.lang.NumberFormatException:对于输入字符串“”
您的字符串中包含空格。一个空格不是有效的int,所以这就是导致您异常的原因。因此,我们应该在解析为int之前删除所有空格。但是,由于这就是您的字符串所包含的全部内容,因此在删除空格之后,字符串的长度将为零,这也不是有效的int,并且还会导致异常。因此,您甚至在尝试将字符串解析为int之前,都要检查每种情况。这使您可以不同地处理每种情况,因此,您可能希望向用户提供一条消息,告知他们的datedob为空,或者其中有非数字字符,这会有所帮助。如果格式设置为数字格式,则不确定您的edittext如何在其中留有空格,但是原始异常消息显示它确实存在。
对于e.getLocalizedMessage(),这是每种不同类型的Exception的一部分的方法,其中包含对异常原因的解释。它与e.getMessage()相同,不同之处在于,如果消息中有任何日期或数字格式,则getLocalizedMessage()方法将格式化设备上活动位置的日期或数字,因此可能更多。您的用户或调试日志中可读的消息。