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

Java Switch case分支未正常执行 打印语句无输出问题

问题定位

你的代码有3处直接导致分支异常的核心错误:

  1. switch代码块位置错误
    当前switch(ch)写在while(ch!=7)循环的外部,逻辑是:只要用户输入不是7,就一直循环打印菜单、读取输入,永远走不到switch判断;只有当用户输入7、循环终止时,才会执行switch,此时ch固定为7,只会触发case7分支,case1、default永远没有执行机会。
  2. 重复创建Scanner实例
    你同时创建了sc1、sc2两个绑定System.in的Scanner对象,两个对象各自维护独立的输入缓冲区,会出现输入读取错位、内容丢失的问题,单线程场景下同一个输入流只需要一个Scanner实例即可。
  3. 输入读取逻辑有冗余+换行符遗留问题
    Scanner.nextInt()方法只会读取输入的整数值,不会消费用户输入完整数后敲击的回车换行符,这个残留的换行符会被后续的nextLine()直接读取,返回空字符串;另外你在case1中连续调用了两次sc2.nextLine(),就算逻辑位置正确,第一次读取分类名也会直接读到空值。
修复后可运行代码

修复点对应上述问题:将switch移入循环内部、删除多余Scanner实例、消费nextInt遗留换行、去掉多余的nextLine调用

import java.util.*;
public class StartApp {

    public static void main(String[] args) {
        try {
            String categoryName = "";
            int ch = 0;   
            // 单例Scanner处理所有输入
            Scanner sc = new Scanner(System.in);
            Logger.getInstance().log("Starting task manager", 1);   
            while(ch != 7)
            {
                System.out.println("press 1 to create category");
                System.out.println("press 2 to load category");
                System.out.println("press 3 to remove category");
                System.out.println("press 4 to list category");
                System.out.println("press 5 to search category");
                System.out.println("press 6 to export");
                System.out.println("press 7 to exit");
                ch = sc.nextInt();
                // 消费nextInt残留的换行符
                sc.nextLine();
                // 每次读取输入后立刻执行分支判断
                switch(ch)
                {
                    case 1: {
                        System.out.println("enter category name");
                        categoryName = sc.nextLine();
                        while(!ProjectUtility.validateName(categoryName))
                        {
                            System.out.println("category name must be one word. It cannot contain a numbers,spaces and Alpanumerics.");
                            categoryName = sc.nextLine();
                        }
                        break;
                    }
                    case 7:
                        System.out.println("exiting...");
                        break;
                    default:
                        System.out.println("option not supported");
                        break;
                }
            }
        }
        catch(Throwable t)
        {
            t.printStackTrace();
        }
    }
}
补充说明
  • 当前代码仅实现了1、7两个选项的逻辑,输入2-6时会触发default分支的不支持提示,后续补全功能直接在switch中新增对应case即可。
  • 所有绑定同一个输入流(比如这里的System.in)的操作,不要创建多个Scanner实例,否则会出现不可预期的输入抢占、内容丢失问题。

内容的提问来源于stack exchange,提问作者sanjanaa .p.s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:06:21