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

