Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的程序在循环中跳过提示?_Java_Loops_Skip - Fatal编程技术网

Java 为什么我的程序在循环中跳过提示?

Java 为什么我的程序在循环中跳过提示?,java,loops,skip,Java,Loops,Skip,我的代码应该持续循环,直到输入“stop”作为员工姓名。我遇到的一个问题是,一旦它计算了第一个员工的工时和费率,它将再次跳过输入员工姓名的提示。为什么?(代码在两个单独的类中,顺便说一句)请帮助。这是我的密码: package payroll_program_3; import java.util.Scanner; public class payroll_program_3 { public static void main(String[] args) {

我的代码应该持续循环,直到输入“stop”作为员工姓名。我遇到的一个问题是,一旦它计算了第一个员工的工时和费率,它将再次跳过输入员工姓名的提示。为什么?(代码在两个单独的类中,顺便说一句)请帮助。这是我的密码:

package payroll_program_3;
import java.util.Scanner;

public class payroll_program_3
{
    public static void main(String[] args)
    {

        Scanner input = new Scanner( System.in );

        employee_info theEmployee = new employee_info();

        String eName = "";
        double Hours = 0.0;
        double Rate = 0.0;
        while(true)
        {
            System.out.print("\nEnter Employee's Name: ");
            eName = input.nextLine();
            theEmployee.setName(eName);
            if (eName.equalsIgnoreCase("stop"))
            {
                return;
            }

            System.out.print("\nEnter Employee's Hours Worked: ");
            Hours = input.nextDouble();
            theEmployee.setHours(Hours);
            while (Hours <0)    //By using this statement, the program will not
            {                   //allow negative numbers.
                System.out.printf("Hours cannot be negative\n");
                System.out.printf("Please enter hours worked\n");
                Hours = input.nextDouble();
                theEmployee.setHours(Hours);
            }

            System.out.print("\nEnter Employee's Rate of Pay: ");
            Rate = input.nextDouble();
            theEmployee.setRate(Rate);
            while (Rate <0)    //By using this statement, the program will not
            {                  //allow negative numbers.
                System.out.printf("Pay rate cannot be negative\n");
                System.out.printf("Please enter hourly rate\n");
                Rate = input.nextDouble();
                theEmployee.setRate(Rate);
            }

            System.out.print("\n Employee Name:     " + theEmployee.getName());
            System.out.print("\n Employee Hours Worked:     " + theEmployee.getHours());
            System.out.print("\n Employee Rate of Pay:     " + theEmployee.getRate() + "\n\n");
            System.out.printf("\n %s's Gross Pay: $%.2f\n\n\n", theEmployee.getName(),
                theEmployee.calculatePay());
        }
    }
}

在我的生活中从未使用过Java,但现在它来了

Rate=input.nextDouble()

作为对此行的响应,您可以键入“15.00”,然后点击{enter},这将在输入流中放置一个“新行”,使输入流
15.00\n
。提取Double时,它将使“新行”仍保留在输入流中

当您尝试提示用户输入另一名员工的姓名时,它会显示输入流中仍然有一个“新行”,并且它会立即返回之前的内容,即空字符串


为了清除输入流,运行一个伪.nextLine。

我假设它正在
input.nextLine()
等待输入,但没有出现提示

我的猜测是,在某个地方有一个缓冲问题——提示正在打印,但输出没有到达屏幕。在调用
input.nextLine()
之前,请尝试调用
System.out.flush()

eName = input.nextLine();
将此更改为:

eName = input.next();
它会起作用的

默认情况下,
java.util.Scanner
类会在您点击enter键时开始解析文本。因此,在循环内部,您应该请求
input.next()已在处理一行


请参阅javadoc了解这两种方法。

您可以使用标志变量来签入while循环。无论何时停止输入,都只需将该标志设为false。同时将该标志设为全局变量。我不确定您的确切含义。你能给我举个例子吗?哇。我知道这很简单,我只是忽略了。非常感谢Favonius:)请求关闭投票人,请解释这样做的原因。这不是scanner类的工作方式。换行符
\n
是默认的分隔符,除定义
限制外,不计入任何处理。根据几十个著名网站的信息,这正是它的工作原理。我不知道有任何著名的网站,但请查看javadoc中的
java.util.Scanner
,在那里他们提供了基于正则表达式的语法来解析数字语法。最后明确指出,
空白在上述正则表达式中并不重要。另外,请查看
private void readInput()
private String getCompleteTokenInBuffer(模式模式)
的src,其中
返回与指定模式匹配的“完整令牌”,如果令牌被delims包围,则该令牌是完整的;部分令牌以delims作为前缀,但不以delims作为后缀。
。另外,请查看
私有布尔hasTokenInBuffer()
,如果缓冲区中有完整令牌或部分令牌,则
将返回true。不需要找到完整的标记,因为部分标记意味着将有另一个标记,有或没有更多输入。
如果(matcher.lookingAt())position=matcher.end(),这里也会跳过delims
eName = input.next();