开发简易图书馆书籍日志系统遇Scanner问题:输入书名前程序提前打印
解决Scanner提前跳过输入的问题
嘿,我太懂这个坑了!你遇到的问题是Scanner的输入缓冲区残留换行符导致的,咱们一步步拆解清楚:
问题根源
当你用scan.nextInt()读取书架编号时,它只会抓取输入里的数字部分,而你输入完数字按下的回车键(也就是换行符\n)会留在输入缓冲区里。如果接下来你要用scan.nextLine()读取书名,这个方法会直接把缓冲区里残留的换行符当成空字符串读走,导致程序跳过了输入书名的步骤,直接执行后面的代码——看起来就像“提前打印了下一行内容”。
两种实用解决方法
方法1:手动清空残留的换行符
在nextInt()之后,额外调用一次scan.nextLine()来吃掉那个没用的换行符,这样后续的nextLine()就能正常读取用户输入的书名了:
public void addBook() { Scanner scan = new Scanner(System.in); System.out.println("Enter shelf number which you want to add book: "); int a = scan.nextInt(); // 吃掉nextInt()留下的换行符 scan.nextLine(); if (bookshelf[a-1] == null) { System.out.println("Enter book name: "); String bookName = scan.nextLine(); bookshelf[a-1] = bookName; System.out.println("Book added successfully!"); } else { System.out.println("This shelf is already occupied!"); } }
方法2:用nextLine()读取所有输入再转换
另一种更稳妥的方式是全程用scan.nextLine()读取输入,然后把书架编号的字符串转成整数,这样就不会有残留的换行符问题:
public void addBook() { Scanner scan = new Scanner(System.in); System.out.println("Enter shelf number which you want to add book: "); // 读取整行输入再转成int int a = Integer.parseInt(scan.nextLine()); if (bookshelf[a-1] == null) { System.out.println("Enter book name: "); String bookName = scan.nextLine(); bookshelf[a-1] = bookName; System.out.println("Book added successfully!"); } else { System.out.println("This shelf is already occupied!"); } }
额外小提醒
你当前的bookshelf数组是定义在if(x==1)外面的局部变量,每次调用addBook()或者重启程序时,这个数组都会被重新初始化,之前添加的书会全部消失!建议把它改成类的成员变量,这样整个图书馆系统的方法都能共享这个书架的数据:
public class LibraryLogSystem { // 把书架定义为类成员,数据会一直保留到程序结束 private String[] bookshelf = new String[1000]; public void addBook() { // 这里写addBook的代码 } // 比如删除书籍的方法也能访问这个bookshelf public void deleteBook() { // ... } }
内容的提问来源于stack exchange,提问作者yasineryigit
相关产品推荐
相关产品推荐

