public class Calculator
{
public static void main(String[] args)
{
boolean isValid = false;
Scanner myScanner = new Scanner(System.in);
String customerType = null;
System.out.print("Customer Type? (C/R) ");
customerType = myScanner.next();
while (isValid == false)
{
System.out.print("Enter Subtotal: ");
if (myScanner.hasNextDouble())
{
double sobTotal = myScanner.nextDouble();
isValid = true;
}
else
{
System.out
.println("Hay! Entry error please enter a valid number");
}
myScanner.nextLine();
}
}
}
嗨,我是java新手,像往常一样在扫描仪类中尝试一些东西。
有没有办法查看扫描仪的输入? 因为你会看到我在这里遇到上面代码的问题。这是我输入错误数据后控制台窗口的输出。而不是数字我输入KKK所以有人可以解释我为什么我得到这个错误消息2次?
"this is the console"
Customer Type? (C/R) R
Enter Subtotal: KKK
Hay! Entry error please enter a valid number
Enter Subtotal: Hay! Entry error please enter a valid number
Enter Subtotal:
答案 0 :(得分:2)
按如下方式更改您的代码。
boolean isValid = false;
Scanner myScanner = new Scanner(System.in);
String customerType = null;
System.out.print("Customer Type? (C/R) ");
customerType = myScanner.next();
while (!isValid)
{
System.out.print("Enter Subtotal: ");
if (myScanner.hasNext())
{
try
{
double sobTotal =Double.parseDouble(myScanner.next());
isValid = true;
}
catch(Exception e)
{
System.out.println("Hay! Entry error please enter a valid number");
}
}
}
使用Scanner.nextDouble()
时,它不会消耗新行(或其他分隔符)本身,因此返回的下一个标记通常是空字符串。
答案 1 :(得分:1)
我认为真正的问题是你的循环结构中有一些混淆,这使得每次迭代循环都很难理解扫描器的输入和输出条件。
继承人真正发生的事情。我们在Scanner中输入一个不是双精度令牌的循环。我们问扫描器中有hasNextDouble()
的下一个双,由于一个令牌无法转换为double,因此返回false。我们报告错误,isValid
仍然是错误的。在分支之后,我们调用scanner.next()
并使用非双重令牌。我们租用循环,因为isValid仍然是假的。我们再次询问扫描仪中是否存在双重下一个。现在扫描程序是空的,因为我们消耗了令牌,并且此调用返回false
,因此我们报告了另一个错误。现在我们再次致电scanner.next()
。由于扫描程序现在为空,而scanner.next()实现了同步消息传递(I / O),我们现在会阻塞,直到扫描程序收到新令牌,因此程序将停止,直到您输入新令牌。尝试在控制台中添加更多内容。您可能会重复循环并看到另一个错误。
您想要完成的是每个循环,使用一个令牌。如果该令牌是双精度型,则接受输入并继续,如果不报告错误并重复。尝试这样的事情,它应该更清楚地显示扫描仪在每个循环中做什么。
public class Calculator
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
String customerType = null;
System.out.print("Customer Type? (C/R) ");
customerType = scan.next();
Double test = null;
do{
try{
test = scan.nextDouble();
}catch (InputMismatchException ime){ //will be thrown if the token we input is not a double
System.err.println("Error Message");
}
}while(test == null);
}
}
请注意,我使用的是包装类Double
,而不是主要的double
。这样我就可以将double设置为null,因为Double
是Object
而不是原语。
答案 2 :(得分:1)
问题是你正在调用scanner.nextdouble(),如果输入中有一个double,它将正常工作。如果输入中没有double,则调用nextDouble()会忽略输入“KKK”并显示错误消息,然后当您调用nextLine()时,相同输入“KKK”仍然在等待时你循环回来,然后“KKK”然后传回你的程序,因为它仍然不是一个双倍,你得到重复的错误信息。
试试这个:
boolean isValid = false;
Scanner myScanner = new Scanner(System.in).useDelimiter("\\n");
String customerType = null;
System.out.print("Customer Type? (C/R) ");
customerType = myScanner.next();
while (!isValid)
{
System.out.print("Enter Subtotal: ");
if (myScanner.hasNextDouble())
{
double sobTotal = myScanner.nextDouble();
isValid = true;
}
else
{
System.out.println("Hay! Entry error please enter a valid number");
if(myScanner.hasNext()){
myScanner.next();
}
}
}
这将消耗“KKK”的无效输入并让程序继续正常。