Scanner调用nextInt()后构造方法传参时nextLine()被跳过问题咨询
Scanner方法作为构造参数时nextLine被跳过的解决方案
nextInt()、nextDouble()这类非字符串读取方法,仅会读取输入中的数值部分,不会处理数值后方的换行符。当后续直接调用nextLine()时,会直接读取到该残留的换行符,返回空字符串,这是问题的核心原因。
以下是三种可行的解决方案:
- 方案1:拆分参数读取步骤(最推荐,可读性最高,便于后续调试)
不要直接把Scanner方法调用写在构造参数中,提前读取所有参数并处理换行残留,再传入构造方法:
// 单独读取每个参数,中间插入nextLine清理换行残留 int id = value.nextInt(); value.nextLine(); // 吃掉nextInt遗留的换行符 String productName = value.nextLine(); double price = value.nextDouble(); product c2 = new product(id, productName, price);
- 方案2:使用Java逗号运算符在参数内处理残留换行(仅适合必须写在单行的场景,可读性较差)
利用Java逗号运算符会依次执行表达式、返回最后一个表达式结果的特性,在参数位直接完成换行清理:
product c2 = new product(value.nextInt(), (value.nextLine(), value.nextLine()), value.nextDouble());
括号内会先执行第一个value.nextLine()清理残留换行,再返回第二个value.nextLine()的结果作为构造方法的第二个参数。
- 方案3:统一使用nextLine()读取后手动转换类型(完全规避换行残留问题)
所有输入统一用nextLine()读取,再手动转换为对应类型,从根源上避免不同方法的换行处理差异:
product c2 = new product( Integer.parseInt(value.nextLine()), value.nextLine(), Double.parseDouble(value.nextLine()) );
该方案要求输入时每个值单独占一行,避免类型转换失败。
内容的提问来源于stack exchange,提问作者Muhammad Talha
相关产品推荐
相关产品推荐

