Java Switch case分支未正常执行 打印语句无输出问题
问题定位
你的代码有3处直接导致分支异常的核心错误:
- switch代码块位置错误
当前switch(ch)写在while(ch!=7)循环的外部,逻辑是:只要用户输入不是7,就一直循环打印菜单、读取输入,永远走不到switch判断;只有当用户输入7、循环终止时,才会执行switch,此时ch固定为7,只会触发case7分支,case1、default永远没有执行机会。 - 重复创建Scanner实例
你同时创建了sc1、sc2两个绑定System.in的Scanner对象,两个对象各自维护独立的输入缓冲区,会出现输入读取错位、内容丢失的问题,单线程场景下同一个输入流只需要一个Scanner实例即可。 - 输入读取逻辑有冗余+换行符遗留问题
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
相关产品推荐
相关产品推荐

