Java通讯录项目中Switch分支字符串输入异常求助
搞定你的Java通讯录输入问题!
嘿,这个Scanner的坑我踩过好多次了!你遇到的问题根本不是case分支的问题,而是输入缓冲区里残留的换行符在搞鬼。
问题到底出在哪?
当你用scan.nextInt()获取用户选择的数字时,它只会读取输入的整数部分,而你按下回车产生的\n(换行符)会乖乖留在输入缓冲区里。等你走到case 1或case 3,调用scan.nextLine()想读姓名的时候,nextLine()会直接把这个残留的换行符当成输入内容读走——相当于读了个空字符串,所以看起来就是“没法输入内容”,其实程序已经“读完”了。
两种快速解决办法
办法1:读完整数后手动清空缓冲区
就在scan.nextInt()之后加一行scan.nextLine(),把残留的换行符吃掉就行:
int choice = scan.nextInt(); scan.nextLine(); // 关键!清空缓冲区里的换行符 switch(choice){ case 1: System.out.print("请输入要添加的姓名:"); String name = scan.nextLine(); // 你的姓名处理逻辑 break; case 2: // 输入号码的逻辑(原本正常的部分) int phone = scan.nextInt(); break; case 3: System.out.print("请输入要查询的姓名:"); String searchName = scan.nextLine(); // 你的查询逻辑 break; // 其他case分支... }
办法2:全程用nextLine()读取,再转成整数
如果不想每次都处理缓冲区,干脆统一用nextLine()读所有输入,把选择的字符串转成整数就行,这种方式更不容易踩坑:
System.out.print("请输入你的选择:"); String choiceStr = scan.nextLine(); int choice = Integer.parseInt(choiceStr); // 把字符串转成整数 switch(choice){ case 1: System.out.print("请输入要添加的姓名:"); String name = scan.nextLine(); // 处理逻辑 break; // 其他case... }
小提醒
以后用Scanner的时候要记住:nextInt()、nextFloat()这类方法只读取对应类型的数据,不会处理换行符;而nextLine()会读取从当前位置到换行符的所有内容,包括空内容。混合使用的时候一定要注意缓冲区的状态哦!
内容的提问来源于stack exchange,提问作者Hadi Zafar
相关产品推荐
相关产品推荐

