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

Java读取用户输入问题:分隔符/Pattern匹配异常求助

问题排查:Scanner无法检测输入中的"<"字符

问题根源

你的read方法里的分隔符设置逻辑错误,导致Scanner无法正确识别<字符:

scanner.useDelimiter("[" + originalPattern + ",]"); // 拼接正则的方式本身存在语法问题
scanner.useDelimiter(" "); // 这行直接将分隔符改为空格,覆盖了之前的设置

当用户输入<x,y>这类无空格的字符串时,Scanner会把整个输入当成一个单独的token。而scanner.hasNext("<")的作用是检查是否存在**完全等于"<"**的独立token,并非检查token中是否包含"<",因此会返回false,触发"缺少开头箭头<"的异常。

另外,"[" + originalPattern + ",]"的拼接方式完全错误——originalPattern是Pattern对象,直接转字符串会得到它的正则源码,这么拼接会导致正则语法失效,根本达不到"添加逗号到分隔符"的预期效果。

修复方案

方案1:修正Scanner分隔符逻辑

删除错误的scanner.useDelimiter(" ");行,同时通过跳过空白字符优化检测逻辑:

public boolean read(String commandLine) throws Exception {
    Scanner scanner = new Scanner(commandLine);
    
    // 跳过开头可能存在的空白字符
    scanner.skip("\\s*");
    
    if (scanner.hasNext("<")) {
        scanner.next("<");
        if (scanner.hasNextDouble()) {
            xCoord = scanner.nextDouble();
            
            // 跳过坐标与逗号之间的空白
            scanner.skip("\\s*");
            
            if (scanner.hasNext(",")) {
                scanner.next(",");
                
                // 跳过逗号与y坐标之间的空白
                scanner.skip("\\s*");
                
                if (scanner.hasNextDouble()) {
                    yCoord = scanner.nextDouble();
                    
                    // 跳过y坐标与结束箭头之间的空白
                    scanner.skip("\\s*");
                    
                    if (scanner.hasNext(">")) {
                        scanner.next(">");
                        scanner.close();
                        return true;
                    } else {
                        scanner.close();
                        throw new Exception("缺少结束箭头>");
                    }
                } else {
                    scanner.close();
                    throw new Exception("缺少y坐标");
                }
            } else {
                scanner.close();
                throw new Exception("缺少中间的逗号");
            }
        } else {
            scanner.close();
            throw new Exception("缺少x坐标");
        }
    } else {
        scanner.close();
        throw new Exception("缺少开头箭头<");
    }
}

方案2:使用正则表达式直接匹配(更简洁可靠)

放弃Scanner逐字符检测,直接用正则匹配整个<xcoord,ycoord>格式,代码更简洁且不易出错:

public boolean read(String commandLine) throws Exception {
    // 正则支持坐标前后带空白的格式,比如 < 12.3 , 45.6 >
    Pattern vectorPattern = Pattern.compile("<\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*>");
    Matcher matcher = vectorPattern.matcher(commandLine.trim());
    
    if (matcher.matches()) {
        xCoord = Double.parseDouble(matcher.group(1));
        yCoord = Double.parseDouble(matcher.group(2));
        return true;
    } else {
        throw new Exception("输入格式错误,请使用<xcoord,ycoord>格式,允许坐标前后加空白");
    }
}

内容的提问来源于stack exchange,提问作者Colin Baumgartner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:47:41