在Java中陷入do...while循环

0md85ypi  于 2022-11-20  发布在  Java
关注(0)|答案(3)|浏览(138)

下面是我的代码:

do{
    sc.nextLine();
    System.out.println("What kind of operation do you want to do?");
    String res=sc.nextLine();
    switch(res){
           //cases
           default:System.out.println("Invalid input");
    }
    System.out.print("Do you want to do any other operation? 1/0...");
    ans=sc.nextShort();
}while(ans==1);

每当我尝试执行该块时,第一个操作都很好,但当我输入1执行其他操作时,系统不会询问我“您要执行哪种操作”,而是直接显示“无效输入”。

h7appiyu

h7appiyu1#

这是Scanner的一个已知问题。我不知道细节,但是当你读一个像scan.nextInt()这样的数字,然后你想读一个像scan.next()这样的字符串时,你应该在Scanner中执行scan.nextLine()来切换上下文或smth。

Scanner scan = new Scanner(System.in);
int ans;

do {
    System.out.print("What kind of operation do you want to do? ");
    String res = scan.nextLine();

    switch (res) {
        //cases
        default:
            System.out.println("Invalid input");
    }

    System.out.print("Do you want to do any other operation (0/1)? ");
    ans = scan.nextInt();
    scan.nextLine();    // after reading a number you have to do this to be able to read a string next
} while (ans == 1);
ukdjmx9f

ukdjmx9f2#

我在不同IDE的控制台上看到过关于Scanner的不同问题。我所做的总是使用scanner.nextLine()读取并解析为所需的类型。这样我们也可以验证输入并显示一个用户友好的错误,而不是Scanner在它期望nextInt()时抛出异常,但却得到了其他东西。

ulydmbyx

ulydmbyx3#

这是因为nextShort(或int、long或其他类型)读取所有字节以生成该类型。
看看这个程序:

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

        var scanner = new Scanner(System.in);

        int i = scanner.nextInt();
        var s = scanner.nextLine();
        var s2 = scanner.nextLine();

        System.out.println(i);
        System.out.println(s);
        System.out.println(s2);
    }
}

如果我输入

5
hello

打印

5

hello

这是因为第一个scanner.nextInt()读取字符5,后面的scanner.nextLine()读取到第一行的末尾(剩余一个空字符串),第二个nextLine()读取第二行。
这种情况下的输入字符串也可以可视化为:5\nhello\n扫描仪从位置0开始nextInt()读取并将光标移动到位置1(数字的末尾),nextLine()读取并移动到索引2(第一个\n),第二个移动到位置8
使用不同的输入可以看到该行为:

5 hello
ciao

(so(一个月九个月)
打印输出:

5
 hello
ciao

(mind hello之前空格)
如其他响应中所述,您应该在nextShort()之后也使用nextLine(),请参见nextLine(),就像等待用户打印回车一样

相关问题