Java 我收到两份相同的声明?

Java 我收到两份相同的声明?,java,Java,在我的验证方法中,我希望它打印一条错误消息,如果用户输入字母而不是十进制值,那么该方法确实会在控制台上打印一条错误消息,但它会打印两次,例如,如果我输入“dfdff”而不是十进制值,它会打印出来: 错误,无效号码。请重试 错误,无效号码。请重试 如何让它在用户每次输入错误值时打印一次错误消息 public static double getVaildSubtotal(Scanner sc) { double subtotal = 0.0; boolean isValid =

在我的验证方法中,我希望它打印一条错误消息,如果用户输入字母而不是十进制值,那么该方法确实会在控制台上打印一条错误消息,但它会打印两次,例如,如果我输入“dfdff”而不是十进制值,它会打印出来:
错误,无效号码。请重试

错误,无效号码。请重试

如何让它在用户每次输入错误值时打印一次错误消息

 public static double getVaildSubtotal(Scanner sc)
{

    double subtotal = 0.0;
    boolean isValid = false;
    while (isValid == false)
    {
       if (sc.hasNextDouble())
       {
           subtotal = sc.nextDouble();
           isValid = true;
       }
       else
       {
           System.out.println("Error! Invalid decimal value. Try again.");
       }
       sc.nextLine();

       if (isValid == true && subtotal <= 0)
       {
           System.out.println("Error! Number must be greater then 0.");
           isValid = false;
       }
       else if (isValid == true && subtotal >= 10000)
       {
          System.out.println("Error! Number must be less then 10000.");
           isValid = false; 
       }

    }

    return subtotal;
}
公共静态双getVaildSubtotal(扫描仪sc)
{
双倍小计=0.0;
布尔值isValid=false;
while(isValid==false)
{
if(sc.hasNextDouble())
{
小计=sc.nextDouble();
isValid=true;
}
其他的
{
System.out.println(“错误!十进制值无效。请重试”);
}
sc.nextLine();
如果(isValid==true&&subtotal=10000)
{
System.out.println(“错误!数字必须小于10000”);
isValid=false;
}
}
返回小计;
}

这可能是因为
Scanner
类的
nextDouble()
方法没有“吃”换行符。这可能会导致
nextLine()
方法在通过
nextDouble()
和类似方法读入原语后,在移动到下一行之前返回空行

这可能会导致一些棘手的结果,但最简单的方法是通过在此处插入额外的
nextLine()
来强制
Scanner
显式处理换行:

if (sc.hasNextDouble()) {
    subtotal = sc.nextDouble();
    sc.nextLine();
    isValid = true;
}
请注意,当扫描程序的分隔符不只是匹配换行符时,这可能会导致意外结果。在这种情况下,您可能会意外跳过多个输入。由于您通常希望按换行符拆分,因此,您可以通过在创建扫描仪时更改其分隔符来创建一个更持久的解决方案,如下所示:

Scanner sc = new Scanner(System.in);
sc.useDelimiter("[\r\n]+");
使用该解决方案,您将不再需要使用额外的
nextLine()
调用,因为任何额外的换行符都将被忽略。但是,此系统也将无法响应空行输入,这将使用该分隔符跳过。如果要处理这些内容,可以使用额外的
nextLine()
fix以及此分隔符以确保安全:

sc.useDelimiter("\r\n|[\r\n]");

您必须调用
sc.nextLine()两次,因为在给出一些输入后,您正在按enter键生成换行符。

因此,您可以通过再添加一个
sc.nextLine()来处理这个额外的换行符

现在我刚开始使用Java,所以请对我温柔一点

在我为班级编写的一个小程序中,我遇到了类似的情况,因此我采用了以下原则:

public static double getVaildSubtotal(Scanner sc)
{ 
    double subtotal = 0.0;
    boolean isValid = false;
    while (isValid != true)
    {
        String stSubTotal = sc.nextLine().trim();
        int subTotalLength = stSubTotal.length();  
        boolean checkDouble = true;
        for (int k = 0; k < subTotalLength; k++)
        {
            if (Character.isDigit(stSubTotal.charAt(k)) != true)
            {
                System.out.println("Error! Invalid decimal value. Try again.");
                checkDouble = false;
            }
        }
        if (checkDouble == true)
        {
            subtotal = Double.parseDouble(stSubTotal);
            if (subtotal <= 0)
            {
                System.out.println("Error! Number must be greater then 0.");                    
            }
            else if (subtotal >= 10000)
            {
                System.out.println("Error! Number must be less then 10000.");                    
            }
            else
            {
                isValid = true;
            }
        }            
    }
    return subtotal;
}
公共静态双getVaildSubtotal(扫描仪sc)
{ 
双倍小计=0.0;
布尔值isValid=false;
while(isValid!=true)
{
字符串stSubTotal=sc.nextLine().trim();
int subTotalLength=stSubTotal.length();
布尔checkDouble=true;
对于(int k=0;k
无论如何,像这样,每个条目只会得到一个错误代码,因为条目会吞噬整行

但是,如果您对重建控制盘不感兴趣(老实说,我不会被侮辱),那么代码当前的问题是您的sc.nextLine();现在,.nextLine()

“使此扫描仪前进超过当前行并返回跳过的输入。”

在这种情况下,这只是我的信念,你的sc.nextLine();正在像预期的那样读取.nextLine()的输入。所以当它来看看里面是否有一个双精度,不,没有双精度,只有\n


我建议删除sc.nextLine();如果确实需要一个空格,希望它是nextLine(),我会为.nextLine()添加另一个本地扫描仪;在验证方法中。

我很好奇,你是否能做到这一点;这正是我最近一直在做的编码。