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

Java整合MySQL简易书店应用:输入带空格多词触发运行异常求助

根因定位

核心偏差来自对Scanner不同读取方法的行为认知错误:

  • Scanner.next()的读取终止条件为遇到任意空白字符(空格、制表符、换行符),仅能读取到第一个空格前的连续非空白内容,且不会消费终止位置的空白字符,会将其残留在输入流缓冲区。
  • 当输入带空格的多词内容时,next()只会拿到第一个词,剩下的后半段内容、以及用户输入完成按下的换行符都会留在缓冲区里,后续流程读取输入时就会拿到残留的空值/半段内容,直接导致SQL参数不匹配、检索逻辑报错、程序中断。
    感知到的“连续读取相邻两段内容”本质就是输入流里残留的未消费内容被后续读取逻辑拿到的表现。
针对性修复方案
  • 所有需要支持带空格输入的场景(书名、作者名、分类名等字符串类输入项),将原有的scanner.next()替换为scanner.nextLine(),该方法会读取从当前位置到本次输入换行符的全部内容,完整保留中间的空格。
  • 处理方法混用的残留问题:如果代码中使用了nextInt()、nextDouble()这类读取数值的方法,这类方法同样不会消费输入末尾的换行符,会导致后续第一次调用nextLine()直接读到空行。碰到这类场景,在数值读取完成后,手动调用一次无返回值的scanner.nextLine()消费掉残留的换行,再读取后续的字符串内容。
  • 输入预处理:拿到整行输入后,调用trim()方法去掉首尾多余空格,避免用户误输入的首尾空白影响数据库匹配结果。

代码示例

错误写法(不支持带空格输入):

// 仅能读取空格前的内容
String bookName = scanner.next();
String authorName = scanner.next();

正确写法(支持带空格输入):

// 完整读取整行内容
String bookName = scanner.nextLine().trim();
String authorName = scanner.nextLine().trim();

数值读取后的兼容处理示例:

// 错误流程:读完数值直接读字符串会拿到空值
System.out.println("请输入图书定价:");
double price = scanner.nextDouble();
System.out.println("请输入图书全名:");
String bookName = scanner.nextLine(); // 拿到空字符串

// 修复后的流程
System.out.println("请输入图书定价:");
double price = scanner.nextDouble();
scanner.nextLine(); // 消费掉nextDouble()残留的换行符
System.out.println("请输入图书全名:");
String bookName = scanner.nextLine().trim();
额外注意事项

构建SQL语句时,使用PreparedStatement的占位符传入读取到的参数,不要直接将用户输入的字符串拼接进SQL语句,既可以避免SQL注入风险,也能防止带特殊字符的输入触发SQL语法错误。

内容的提问来源于stack exchange,提问作者nbon。

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 07:15:04