boolean loop = false;
double numberOfStudents;
System.out.print("Enter a number: ");
if ((scnr.nextLine().trim().isEmpty()) ) {
loop = true;
}
while (loop) {
System.out.println("Enter a number");
if (scnr.hasNextDouble() ){
System.out.println("Loop has stopped");
numberOfStudents = scnr.nextDouble();
loop = false;
}
}
System.out.println("You're outside the loop!");
我试图让节目说出" 输入一个数字"直到用户输入实际数字(没有空格或字母或符号)。当用户输入一个数字时,它会将numberOfStudents
设置为等于该数字,并突破循环。
但如果你按两次输入,它就不会迭代。它只显示" 输入数字"一旦。
循环逻辑有什么问题?为什么在进行有效输入之前它不会循环?
答案 0 :(得分:3)
对于“为什么不输入数字”问题的实际答案不止一次?见Tom's comment(更新:汤姆的回答)。
我已经以保留代码的方式重写了你的循环,但也使得处理格式异常变得容易一些(虽然冒着悄悄地吞下异常的风险 - 这个用例应该是可以接受的)。 / p>
可以由你来使用这个设计,here is an SO post为什么空的catch块可能是一个不好的做法。
public static void main(String args[])
{
boolean loop = true;
double numberOfStudents;
Scanner scnr = new Scanner(System.in);
while(loop){
System.out.print("Enter a number: ");
String input = scnr.nextLine();
try{
numberOfStudents = Double.parseDouble(input);
loop = false;
}catch(NumberFormatException e){
}
}
System.out.println("You're outside the loop!");
}
输出:
输入数字:
输入一个数字:
输入一个数字:
输入一个数字:50
你在循环之外!
答案 1 :(得分:3)
虽然trobbins代码基本上解决了您的问题,但使用异常进行流量控制是不好的做法。
我使用了一个小的正则表达式来检查该值是否为数字。但是这个例子并不完整,用户输入例如两个小数点时仍然会崩溃。因此,您需要创建一个正确的数字检查,或者只使用检查更容易的整数。
评论中的某些人指出,人们可能想要输入像5e10
这样的科学记数法,所以这也是另一种需要检查的案例。如果这只是您需要的一些代码作为概念证明或快速和脏的东西,您可以使用异常处理方法,但在生产代码中,您应该避免以这种方式使用异常。
double numberOfStudents;
Scanner scnr = new Scanner(System.in);
while(true) {
System.out.print("Enter a number: ");
String input = scnr.nextLine().trim();
if(input.matches("^[0-9\\.]{1,}$")) {
System.out.println("Loop has stopped");
numberOfStudents = Double.parseDouble(input);
break;
}
}
System.out.println("You're outside the loop!");
答案 2 :(得分:3)
首先:由于您正在从System.in
读取,因此对输入流的调用将会阻止,直到用户输入有效的令牌。
因此,让我们使用您的scnr
变量检查第一次扫描:
scnr.nextLine()
nextLine()
读取所有内容直到下一行分隔符。因此,如果您只需按 return ,它就会成功读取它并执行下一步。
下一个电话是:
scnr.hasNextDouble()
此调用需要“真实”令牌并忽略空格,除非作为标记之间的分隔符。因此,如果您再次按 return ,它实际上并不会读取该输入。所以它仍然等待更多(对于第一个令牌)。这就是为什么它会停留在你的循环中而你不会得到另一个“输入数字”输出。
您可以通过输入真实令牌(如数字)或更改trobbins之类的循环来解决此问题。
我希望你现在能更多地理解你的程序流程:)。
答案 3 :(得分:2)
以下代码可以帮助您:
double numberOfStudents = 0;
Scanner scnr = new Scanner(System.in);
boolean readValue = false; //Check if the valid input is received
boolean shouldAskForNumber = true; //Need to ask for number again? Case for Enter
do {
if (shouldAskForNumber) {
System.out.print("Enter a number:");
shouldAskForNumber = false;
}
if (scnr.hasNextDouble()) {
numberOfStudents = scnr.nextDouble();
readValue = true;
} else {
String token = scnr.next();
if (!"".equals(token.trim())) { //Check for Enter or space
shouldAskForNumber = true;
}
}
} while (!readValue);
System.out.printf("Value read is %.0f\n", numberOfStudents);
System.out.println("You're outside the loop!");
以不同的方式理解以下陈述:
但如果你按两次输入,它就不会循环回来。它只显示 "输入一个数字"一次。
代码设置为打印"如果用户点击 RETURN / ENTER ,则仅输入一个数字" 进入空间角色。您可以删除特殊检查并在需要时使用代码。
答案 4 :(得分:1)
import java.util.Scanner;
public class Testing {
public static boolean checkInt(String s)
{
try
{
Integer.parseInt(s);
return true;
} catch (NumberFormatException ex)
{
return false;
}
}
public static void main(String[] args) {
boolean loop = false;
double numberOfStudents;
Scanner scnr = new Scanner(System.in);
String input = "";
while (!(checkInt(input))) {
System.out.println("Enter a number");
input = scnr.nextLine();
}
numberOfStudents = Integer.parseInt(input);
System.out.println("Number of students: " + numberOfStudents );
}
}
//如果您想要查看,此代码工作正常。 //在你的代码中,如果第一个是int / double,你需要另一个输入;如果第一个输入不是数字,那么你提到再次输入..
答案 5 :(得分:0)
使用调试器查看代码实际执行的操作。 Here's a guide on debugging in Eclipse。完成代码调试后,您可能会知道问题所在。
答案 6 :(得分:0)
以下代码正常运作,
boolean loop = true;
double numberOfStudents;
Scanner scnr=new Scanner(System.in);
while(loop) {
System.out.println("Enter a number");
if ((scnr.nextLine().trim().isEmpty()) ) {
loop = true;
}
if (scnr.hasNextDouble() ){
System.out.println("Loop has stopped");
numberOfStudents = scnr.nextDouble();
loop = false;
}
}
System.out.println("You're outside the loop!");
输出是,
run:
Enter a number
hj
po
Enter a number
lhf
Enter a number
o
Enter a number
p
Enter a number
a
Enter a number
34
Loop has stopped
You're outside the loop!
答案 7 :(得分:0)
以下代码可以帮助您
boolean loop = true;
double numberOfStudents;
Scanner scnr = new Scanner(System.in);
System.out.print("Enter a number: ");
String input = scnr.nextLine();
while(!scnr.hasNextDouble()){
System.out.print("Enter a number: ");
try{
numberOfStudents = Double.parseDouble(input);
break;
}catch(NumberFormatException e){
}
input = scnr.nextLine();
}
System.out.println("You're outside the loop!");
答案 8 :(得分:-1)
如果您想再次从扫描仪获取更多值,则必须扫描下一行。代码应该是:
while (loop) {
System.out.println("Enter a number");
if(!(scnr.nextLine().trim().isEmpty())){
if (scnr.hasNextDouble() ){
System.out.println("Loop has stopped");
numberOfStudents = scnr.nextDouble();
loop = false;
}
}
}