Java:扫描器行为调试

Java:扫描器行为调试,java,debugging,Java,Debugging,所以这里的问题是,当我再次尝试跑步时,它不会起任何作用。 它将运行一段时间,然后中断。我知道我没有使用currentTimeMillis是的,有人知道这里有什么问题吗。我不擅长编码,如果你有一些改进我代码的建议,请随时告诉我。 是的,我试着在网上找anwsers,但什么也没找到。对不起,英语不好 public static String list(ArrayList<String> lause2) { Collections.shuffle(lause2); Stri

所以这里的问题是,当我再次尝试跑步时,它不会起任何作用。 它将运行一段时间,然后中断。我知道我没有使用currentTimeMillis是的,有人知道这里有什么问题吗。我不擅长编码,如果你有一些改进我代码的建议,请随时告诉我。 是的,我试着在网上找anwsers,但什么也没找到。对不起,英语不好

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);

    }

}
公共静态字符串列表(ArrayList lause2){
收藏。洗牌(lause2);
字符串pleb=lause2.get(lause2.size()-1);
返回pleb;
}
公共静态void main(字符串[]args)引发异常{
扫描仪打印机=新扫描仪(System.in);
ArrayList lause2=新的ArrayList();
ArrayList keskiarvo=新的ArrayList();
长启动=System.currentTimeMillis();
长端=起点+10*6000;
int-laskuri=0;
布尔go=true;
布尔运行=真;
System.out.println(“欢迎使用打字更快”);
println(“程序会给你们随机的单词,你们会尽可能快地写出它们,若你们不及格,那个就结束了,祝你们好运!”);
lause2.添加(“你好”);
//不同lause2的负载。添加(“随机”);
lause2.添加(“假期”);
系统输出打印LN(列表(lause2));
while(System.currentTimeMillis()
如果您知道
扫描仪的工作原理,那么答案相当简单。在第二次运行中,您有以下行:

String kirjoitus1 = printer.nextLine();
char again = printer.next().charAt(0);
假设该方法现在等待用户进行一些输入。然后将其与第一次运行时进行比较等。显然,第二个循环执行
中断
。为什么?您可以通过放入
System.out.println(“调试:+kirjoitus1”)来轻松检查这一点就在它前面。
你看,这个值是一个空文本,它不等于
something1
,因此执行
break

为什么文本是空的,不等待用户输入?您上次使用的
扫描仪
如下:

String kirjoitus1 = printer.nextLine();
char again = printer.next().charAt(0);
此时,方法
next
确实在等待用户输入但是它只读取写入输入的第一个标记。其余输入保留在
扫描仪的内部缓冲区中。因此,在这个方法
Scanner
之后,我们还有一些未读的输入,下次调用
nextLine()
时,它会返回这些未读的内容

因此,您需要做的是在
yes/no
之后清除缓冲区。您只需在此处使用
nextLine()
而不是
next()
即可:

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

文档中的更多信息:

标题有点误导,因为您将错误的源代码识别为代码错误。