为何我的Java程序中Println语句会一次性全部输出?
你遇到的问题是Scanner输入缓冲区残留换行符导致的。当你用keyboard.nextInt()读取菜单选项时,用户输入数字后按下的回车(对应换行符\n)并没有被nextInt()消费,而是留在了输入缓冲区里。接下来调用keyboard.nextLine()时,它会直接读取这个残留的换行符,相当于用户直接按了回车,程序跳过了等待输入的步骤,直接执行后续打印语句,看起来就像前几个println一次性输出了。
有两种常用的解决方法,你可以根据习惯选择:
方法1:在每个nextInt()后添加nextLine()清空缓冲区
每次用nextInt()读取整数后,额外调用一次keyboard.nextLine()来吃掉残留的换行符,这样后续的nextLine()就能正常等待用户输入了。
比如修改菜单选择的关键代码:
menuChoice = keyboard.nextInt(); keyboard.nextLine(); // 新增这一行,清空缓冲区里的换行符
同样,在修改菜单的amendChoice=keyboard.nextInt();之后也要加:
amendChoice=keyboard.nextInt(); keyboard.nextLine(); // 新增:清空换行符
其他使用nextInt()的地方(比如输入Portfolio ID的i=keyboard.nextInt();),都需要加上这行代码。
方法2:统一用nextLine()读取所有输入,再转成整数
如果你不想每次都处理换行符,可以把所有输入都用nextLine()读取,再将需要整数的部分用Integer.parseInt()转换。比如菜单选择可以改成:
System.out.println("请输入菜单选项:"); String menuInput = keyboard.nextLine(); menuChoice = Integer.parseInt(menuInput);
这种方法能彻底避免缓冲区问题,但需要处理用户输入非数字的异常(可以加try-catch块优化)。
这里只展示关键修改部分:
do//do loop to run main menu { // 菜单打印内容不变 menuChoice = keyboard.nextInt(); keyboard.nextLine(); // 新增:清空换行符 if (menuChoice == 1) //create a portfolio { int j = 1; for(int i = 0; i < j; i++) { System.out.println("Please Enter The Name of The Portfolio Holder: "); newName=keyboard.nextLine(); // 现在能正常读取用户输入 System.out.println("Your ID Number is: " + i); newID = " " + i; System.out.println("Please Enter The DOB of The Portfolio Holder(DD/MM/YYYY): "); StringDate=keyboard.nextLine(); // 这里也能正常等待输入 // 后续Portfolio创建代码不变 } } else if(menuChoice == 2) { int i; System.out.println("Please Enter The ID Number Of The Portfolio You Wish To Amend: "); i=keyboard.nextInt(); keyboard.nextLine(); // 新增:清空换行符 Portfolios.get(i); int amendChoice; // 修改菜单打印内容不变 amendChoice=keyboard.nextInt(); keyboard.nextLine(); // 新增:清空换行符 if(amendChoice == 1)//update Portfolio name { System.out.println("Please Enter the Updated Name of the Portfolio Holder: "); newName=keyboard.nextLine(); // 正常读取输入 // 后续修改代码不变 } // 其他修改分支同理处理 } // 其他菜单选项处理同理 } while(menuChoice !=7); // 假设你的循环退出条件是选择7
你的日期格式化代码有个细节问题:SimpleDateFormat里的DD代表一年中的第几天,而你需要的是一个月中的第几天,应该用小写dd。正确的格式字符串是:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH);
(另外yyyy是标准年份格式,大写YYYY虽然有时能工作,但小写更规范)
内容的提问来源于stack exchange,提问作者El_Microman

