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
相关产品推荐
相关产品推荐

