首页 > 解决方案 > 扫描仪在构造函数中跳过我的 nextline() 语句

问题描述

好的,所以我知道nextInt()如果我们使用nextLine()它之后会跳过它,并纠正我们nextLine()在它之前使用了额外的纠正它。没关系,但问题是我正在扫描构造函数中的值,我无法在其中添加额外nextLine()内容,因为它给了我错误。

product c2=new product(value.nextInt(),value.nextLine(),value.nextDouble());

标签: javainputjava.util.scanner

解决方案


好的,所以我知道在 nextInt() 之后如果我们使用 nextLine() 它将跳过它,并纠正我们在它之前使用额外的 nextLine() 来纠正它。

这不是真的。扫描仪在任何空格上分割,所以如果你输入“5”然后按回车,然后输入“你好”,上面的就可以了。但是如果用户输入“5”,然后点击空格(你知道,那个键盘上最大的键!)然后输入“Hello”,你的代码就会中断。

正确的解决方案是永远不要使用nextLine. 相反,正确配置您的扫描仪:

Scanner s = new Scanner(System.in);
s.useDelimiter("\\R");
String entireLine = s.next(); // this replaces nextLine
int aNumber = s.nextInt();

\\R是正则表达式:单个换行符。这是您期望 Scanner 开箱即用的功能(开箱即用,scanner 有一个奇怪的默认值 - '任意数量的空格'。在处理这样的命令行输入时不是您想要的)。

正确配置扫描仪后,您的构造函数将运行良好。

如果不知何故这是不可能的,请制作标记的实用方法static并将您的扫描仪传递给它;super()您可以从构造函数的行内调用它们。但与仅正确设置扫描仪相比,这是一个非常遥远的蹩脚的第二选择。


推荐阅读