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

为何我的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块优化)。

修改后的代码示例(以方法1为例)

这里只展示关键修改部分:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:01:19