You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:01:18