Java技术问询:如何实现无空格单行表达式输入并计算结果?
问题分析
你的代码依赖nextInt()和next()读取输入,但Scanner默认以空白字符作为分隔符。当输入1+1这类无空格表达式时,nextInt()会尝试将整个1+1当作整数解析,直接抛出InputMismatchException,这就是报错的核心原因。
解决方案
要处理无空格表达式,需先读取整行输入,再手动拆分出两个数字和运算符。以下是两种适合初学者的实现方式:
方法1:用正则表达式快速拆分
正则表达式能精准匹配[数字][运算符][数字]的固定格式,代码简洁高效:
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Mod2 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("Beginning Application"); System.out.println("Enter expression like [value][operator][value2] no spaces"); // 读取整行输入,保留完整表达式 String input = sc.nextLine(); // 正则规则:匹配数字、指定运算符、数字的组合 Pattern pattern = Pattern.compile("(\\d+)([+\\-*/%])(\\d+)"); Matcher matcher = pattern.matcher(input); if(matcher.matches()){ // 提取分组内容并转换为对应类型 int value1 = Integer.parseInt(matcher.group(1)); String operator = matcher.group(2); int value2 = Integer.parseInt(matcher.group(3)); int result = 0; switch (operator) { case "+": result = value1 + value2; break; case "-": result = value1 - value2; break; case "*": result = value1 * value2; break; case "/": result = value1 / value2; break; case "%": result = value1 % value2; break; } System.out.println(result); } else { System.out.println("输入格式错误,请输入如1+1的无空格表达式"); } System.out.println("Ending application"); sc.close(); } }
关键细节:
sc.nextLine():读取用户输入的完整一行,不受空格影响*(\\d+)*:正则分组,匹配一个或多个连续数字*([+\\-*/%])*:匹配指定的算术运算符(-放在中间避免被当作范围符号)matcher.matches():验证输入是否完全符合预设格式
方法2:手动遍历字符拆分
如果还未学习正则,可通过遍历字符串找到运算符位置,再拆分数字:
import java.util.Scanner; public class Mod2 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("Beginning Application"); System.out.println("Enter expression like [value][operator][value2] no spaces"); String input = sc.nextLine(); int operatorPos = -1; char operator = ' '; // 遍历字符串,定位运算符位置 for(int i = 0; i < input.length(); i++){ char c = input.charAt(i); if(c == '+' || c == '-' || c == '*' || c == '/' || c == '%'){ operatorPos = i; operator = c; break; } } if(operatorPos != -1){ // 拆分运算符前后的数字字符串 String value1Str = input.substring(0, operatorPos); String value2Str = input.substring(operatorPos + 1); try{ int value1 = Integer.parseInt(value1Str); int value2 = Integer.parseInt(value2Str); int result = 0; switch (operator) { case '+': result = value1 + value2; break; case "-": result = value1 - value2; break; case "*": result = value1 * value2; break; case "/": result = value1 / value2; break; case "%": result = value1 % value2; break; } System.out.println(result); } catch(NumberFormatException e){ System.out.println("输入的不是有效整数"); } } else { System.out.println("未找到有效运算符,格式错误"); } System.out.println("Ending application"); sc.close(); } }
关键细节:
- 遍历每个字符,判断是否为目标运算符并记录位置
substring():截取运算符前后的子串,转换为整数try-catch:捕获数字格式错误,避免程序崩溃
额外提示
- 用完Scanner后调用
sc.close()关闭资源,养成良好习惯 - 可增加除数为0的判断,避免出现算术运行时异常
内容的提问来源于stack exchange,提问作者Miguel Guerra
相关产品推荐
相关产品推荐

