在Android开发的过程中,有时候对输入框中的值进行数字类型转换时经常出现NumberFormatException。其根本原因就是被转换的字符不是一个数字。
下面是我遇到的一种情况:
xml内容如下:
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:maxEms="7"
android:maxLength="7"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:inputType="numberDecimal" />
复现步骤:
在输入框中,直接输入.
时出现异常。
异常日志:
java.lang.NumberFormatException: For input string: "."
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseFloat(FloatingDecimal.java:122)
at java.lang.Float.parseFloat(Float.java:452)
原因分析
在Java代码中设置了addTextChangedListener
监听器,当文本改变的时候,进行了数字类型转换。所以在转换的时候就会有一个风险,就是当输入的不是数字类型的字符时,就会出现NumberFormat异常。
etActualVol.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!s.toString().trim().equals("")) {
Float.parseFloat(input);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
解决办法
在监听文本变化的函数中增加判断函数,或者增加校验规则。
etActualVol.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!s.toString().trim().equals("") && !s.toString().startsWith(".")) {
Float.parseFloat(input);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
以上只是我遇到的情况之一,在开发的过程中肯定还会有其它的情况出现。只要知道了为什么会出现这个异常,大概排查的思路也就清晰了。
希望能帮到读者,感谢点赞。