我使用Scanner
方法nextInt()
和nextLine()
读取输入。
它看起来像这样:
System.out.println("Enter numerical value");
int option;
option = input.nextInt(); // Read numerical value from input
System.out.println("Enter 1st string");
String string1 = input.nextLine(); // Read 1st string (this is skipped)
System.out.println("Enter 2nd string");
String string2 = input.nextLine(); // Read 2nd string (this appears right after reading numerical value)
问题是,在输入数值后,跳过第一个input.nextLine()
,执行第二个input.nextLine()
,因此我的输出如下:
Enter numerical value
3 // This is my input
Enter 1st string // The program is supposed to stop here and wait for my input, but is skipped
Enter 2nd string // ...and this line is executed and waits for my input
我测试了我的应用程序,看起来问题在于使用input.nextInt()
。如果我删除它,那么string1 = input.nextLine()
和string2 = input.nextLine()
将按我希望的方式执行。
23条答案
按热度按时间dldeef671#
对于java初学者来说,这是一个非常基本的问题。我在开始java(自学)时也遇到过同样的问题。实际上,当我们获取整数数据类型的输入时,它只读取整数值并留下换行符(\n),而这一行(即,通过整数动态输入离开新行)会在我们尝试获取新输入时产生问题。例如,如果我们接受整数输入,然后尝试接受字符串输入。
value2将自动读取换行符,不会接受用户输入。
解决方案:只需在进行下一个用户输入之前添加一行代码,即。
或
注意:不要忘记关闭扫描仪以防止内存泄漏;
ztmd8pv52#
问题在于输入。nextInt()方法-它只读取int值。所以当你继续阅读输入时。nextLine()您将收到“\n”回车键。因此,要跳过此步骤,必须添加input.nextLine()。希望现在一切都清楚了。
试着这样做:
6pp0gazn3#
为什么每次读取时不使用新的扫描仪?如下所示。使用这种方法,您将不会面临您的问题。
wko9yo5t4#
nextLine()
将直接作为空行读取输入,无需等待文本。通过添加额外的扫描仪来使用空行的简单解决方案:
zbq4xfa05#
要解决此问题,只需进行扫描。nextLine(),其中scan是扫描仪对象的示例。例如,我使用一个简单的HackerRank问题来解释。
}
o2rvlv0m6#
使用此代码将修复您的问题。
uqjltbpv7#
由于
nextXXX()
方法不读取newline
,nextLine()
除外。我们可以在读取任何non-string
值(本例中为int
)后跳过newline
,方法如下:jv4diomz8#
如果您想同时读取字符串和整数,解决方案是使用两个扫描仪:
2ul0zpep9#
为避免此问题,请在
nextInt();
之后立即使用nextLine();
,因为它有助于清除缓冲区。按下ENTER
时,nextInt();
不会捕获新行,因此稍后跳过Scanner
代码。0kjbasz610#
如果您想快速扫描输入,而不会混淆扫描仪类nextLine()方法,请使用自定义输入扫描仪。
代码:
优点:
方法:
用法:
1.将给定代码复制到java代码下面。
1.初始化给定类的对象
ScanReader sc = new ScanReader(System.in);
3.导入必要的类:import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream;
4.从主方法抛出IOException以处理异常5.使用提供的方法。6.享受例如:
xnifntxz11#
与解析输入相比,
sc.nextLine()
更好。因为在性能方面,这将是好的。cetgtptt12#
我想我参加晚会已经晚了。。
如前所述,在获取int值后调用
input.nextLine()
将解决问题。代码不起作用的原因是,从输入(输入int的地方)到string1
中没有其他存储。我只想对整个主题再解释一下。将*nextLine()视为Scanner类中nextFoo()方法中的奇数。让我们举一个简单的例子。假设我们有两行代码,如下所示:
如果我们输入以下值(作为一行输入):
54 234
firstNumber
和secondNumber
变量的值分别变为54和234。之所以如此,是因为当nextInt()方法接受值时,不会自动生成换行符(即\n)。它简单地接受“next int”*,然后继续前进。这对于除nextLine()之外的其他nextFoo()方法也是一样的。nextLine()在获取值后立即生成新行换行符;这就是@RohitJain所说的新行馈送被“消耗”的意思。
最后,next()方法只取最近的字符串,而**不生成新行;这使得它成为在同一行中获取单独字符串的首选方法。
我希望这有助于……快乐编码!
ut6juiuv13#
k3fezbri14#
避免:
–如果以下输入被未经检查的
scan.nextLine()
吃掉,则数据丢失–由于
scan.nextLine()
被scan.next()
替换,仅部分读取行导致数据丢失*(输入:“yippie ya yeah”)*–使用
Scanner
方法解析输入时抛出的E1D3D1E*(先读取,后解析)*在上述示例中使用:
7gyucuyw15#
使用2个扫描仪对象,而不是一个