Java:扫描程序行为调试

时间:2016-09-24 13:59:55

标签: java debugging

所以问题在于,当我再试一次时,它不会做任何事情。 它将运行一次然后休息。我知道我没有使用currentTimeMillis,任何人都知道这里的问题是什么。如果您有一些改进我的代码的建议,请随时告诉我,我不擅长编码。 是的,我试着在网上找到了,但我没有找到任何东西。抱歉英文不好!

public static String list(ArrayList<String> lause2) {
    Collections.shuffle(lause2);
    String pleb = lause2.get(lause2.size() - 1);

    return pleb;
}

public static void main(String[] args) throws Exception {
    Scanner printer = new Scanner(System.in);
    ArrayList<String> lause2 = new ArrayList<>();
    ArrayList<Integer> keskiarvo = new ArrayList<>();

    long start = System.currentTimeMillis();
    long end = start + 10 * 6000;
    int laskuri = 0;

    boolean go = true;
    boolean run = true;

    System.out.println("Welcome to Typefaster");
    System.out.println("Program will give you random words you will write them as fast as you can for an minute if you fail ones it's over Good luck!");

    lause2.add("hello");
    //Loads of different lause2.add("random"); 
    lause2.add("vacation");

    System.out.println(list(lause2));
    while (System.currentTimeMillis() < end) {
        laskuri++;
        String something = list(lause2);
        System.out.println("Write " + something);
        String kirjoitus = printer.nextLine();
        if (kirjoitus.equals(something)) {
            System.out.println("yee");
        } else {
            break;

        }

    }
    System.out.println("You wrote " + laskuri + " words");
    keskiarvo.add(laskuri);
    int laskuri2 = 0;



        System.out.println("Run again?");

    char again = printer.next().charAt(0);
    if (again == 'y') {
        run = true;

    } else if (again == 'n') {
        System.out.println("Byebye");
        go = false;
    }

    long start2 = System.currentTimeMillis();
    long end2 = start2 + 10*6000;

    while (System.currentTimeMillis() < end2 && run) {
        laskuri2++;
        String something1 = list(lause2);
        System.out.println("Write " + something1);
        String kirjoitus1 = printer.nextLine();
        if (kirjoitus1.equals(something1)) {
            System.out.println("yee");
        } else {
            break;

        }
        System.out.println("You wrote " + laskuri2 + " words");
        keskiarvo.add(laskuri2);

    }

}

1 个答案:

答案 0 :(得分:0)

如果你知道Scanner是如何工作的,答案就相当容易。在第二轮中,你有这一行:

String kirjoitus1 = printer.nextLine();

您认为该方法现在等待用户进行一些输入。然后你比较它在第一次运行等。显然你的第二个循环执行break。为什么?您可以通过将System.out.println("Debug: " + kirjoitus1);放在其前面来轻松地进行检查。 您看,该值为空文本,不等于something1,因此break会被执行。

为什么文本为空而不等待用户输入?您对Scanner的最后一次使用是在这一行:

char again = printer.next().charAt(0);

此时方法next确实等待用户输入。 它只会读取书面输入的第一个标记。其余输入保留在Scanner的内部缓冲区中。因此,在此方法后Scanner我们仍有一些未读的输入,并且在下次调用nextLine()时会返回此未读的内容。

所以你需要做的是在yes/no之后清除缓冲区。您可以在此处使用nextLine()代替next()来执行此操作:

char again = printer.nextLine().charAt(0);

文档中的更多信息:api/.../Scanner.html