Java程序无法获取eask输入,直接触发无效选项提示问题
问题分析与解决方案
我来帮你搞定这个程序的问题,主要有两个关键原因导致了你的输入异常和判断错误:
1. Scanner输入缓冲区的换行符残留问题
你用sc.nextInt()读取价格后,这个方法只会读取输入的整数部分,而用户按下回车键产生的换行符会留在输入缓冲区里。接下来调用sc.nextLine()的时候,它会直接读取这个空的换行符,导致eask变成了空字符串,自然不匹配"Yes"或"No",直接触发了"Invalid option"的分支。
解决办法很简单:在sc.nextInt()之后,额外调用一次sc.nextLine()来清空缓冲区里的换行符。
2. 字符串比较用错了运算符
Java里字符串不能用==来比较内容,==比较的是两个字符串对象的内存地址,而不是实际的文本内容。你现在写的eask == "Yes"、Product == "Mobile"这类判断,大概率会返回false,即使输入的内容是对的。
正确的做法是用equals()方法(区分大小写)或者equalsIgnoreCase()(不区分大小写,对用户输入更友好)来比较字符串内容。
修正后的完整代码
import java.util.*; class Main { public static void main(String[] args) { int discount = 0, ediscount = 1; Scanner sc = new Scanner(System.in); // 读取产品名称 String product = sc.nextLine(); // 读取价格,之后清空换行符 int price = sc.nextInt(); sc.nextLine(); // 关键:吃掉nextInt()遗留的换行符 // 现在可以正确读取用户输入的Yes/No了 String eask = sc.nextLine(); if (price > 100) { // 用equals比较字符串内容,也可以用equalsIgnoreCase兼容大小写输入 if (eask.equals("Yes") || eask.equals("No")) { if (product.equals("Mobile")) { discount = 10; if (eask.equals("Yes")) ediscount = 12; } else if (product.equals("Laptop")) { discount = 20; if (eask.equals("Yes")) ediscount = 10; } else if (product.equals("gadgets")) { discount = 0; if (eask.equals("Yes")) ediscount = 0; } else { System.out.println("Invalid product"); } } else { System.out.println("Invalid option"); } } else { System.out.println("Invalid price"); } // 这里提醒下:原代码的TBA计算是discount*Price,可能逻辑有误,应该是折扣后价格的话,应该是price * (discount / 100.0f) float TBA = discount * price; System.out.println(TBA); } }
另外提个小细节:变量名按照Java规范应该用小驼峰,比如product而不是Product,这样代码的可读性会更好~
内容的提问来源于stack exchange,提问作者Aminator
相关产品推荐
相关产品推荐

