计算器负数乘法触发NumberFormatException(Invalid Double)问题求助
搞定计算器负数乘法的NumberFormatException问题
嘿,我来帮你解决这个头疼的问题!你的乘法逻辑里,split("\\*")处理后的字符串大概率藏着格式问题,才导致Double.valueOf()解析失败。我给你拆解常见原因和对应的解决方案:
为啥会报错?
- 输入带空格:比如用户输入
-5 * 3,用*分割后,split[0]是"-5 "(末尾带空格),split[1]是" 3"(开头带空格),带空格的字符串根本没法被解析成Double,直接触发异常。 - 表达式首尾有多余的
*:要是输入*-5*3或者-5*3*,分割后会出现空字符串"",解析空字符串肯定报错。 - 连续符号/非法格式:比如输入
-5**3,分割后会出现空元素;或者--5*3这种虽然能解析,但可能不是用户想要的输入,也可能触发异常。
怎么解决?
1. 先清空格再分割
最常见的问题就是空格!先把输入里的所有空格干掉,再分割:
else if(resulttxt.getText().toString().contains("*")){ // 先移除所有空格,避免带空格的子串 String cleanInput = resulttxt.getText().toString().replaceAll("\\s", ""); String[] split = cleanInput.split("\\*"); // 先检查分割后是不是刚好两个操作数,避免无效表达式 if(split.length == 2){ try { double num1 = Double.valueOf(split[0]); double num2 = Double.valueOf(split[1]); finalresult = num1 * num2; // 这里写你的结果展示逻辑 } catch (NumberFormatException e) { // 给用户弹个提示,比如"输入格式不对哦,请检查" e.printStackTrace(); } } else { // 处理格式错误,比如多打了*或者少了数字 } }
2. 提前校验输入格式
用正则表达式先验证整个输入是不是合法的乘法表达式,确保是「数字*数字」的格式(支持正负、小数):
String input = resulttxt.getText().toString().replaceAll("\\s", ""); // 正则匹配:正负号可选 + 整数/小数 + * + 正负号可选 + 整数/小数 Pattern validPattern = Pattern.compile("^-?\\d+(\\.\\d+)?\\*-?\\d+(\\.\\d+)?$"); Matcher matcher = validPattern.matcher(input); if(matcher.matches()){ String[] split = input.split("\\*"); double num1 = Double.valueOf(split[0]); double num2 = Double.valueOf(split[1]); finalresult = num1 * num2; } else { // 提示用户输入正确格式,比如"请输入类似-5*3或3.2*-4.5的表达式" }
3. 保留异常捕获兜底
哪怕做了前面的校验,也建议留着try-catch块,万一有啥意外输入,程序也不会直接崩掉,还能给用户友好提示。
额外小提醒
如果你的计算器支持连续运算(比如5*3+2),那当前只检查contains("*")的逻辑就不够用了,得考虑运算符优先级和完整的表达式解析,但从你的问题来看,应该是处理单个乘法的场景,上面的方案应该能完美解决负数乘法的异常问题~
内容的提问来源于stack exchange,提问作者Hagogs
相关产品推荐
相关产品推荐

