扫描仪读取下一行命令的麻烦
我正在使用'扫描仪'来做一些基本的Java程序。 我读了Integer,Double和String。
我有一些使用扫描仪与其他扫描仪像int和双重字符串的问题。
声明部分:
Scanner scan = new Scanner(System.in);
int i2;
double d2;
String s2;
为了#1:
i2 = scan.nextInt();
d2 = scan.nextDouble();
s2 = scan.nextLine();
结果:编译器等待输入i2和d2,但不等待输入s2。 它在s2 = scan.nextLine();
后执行s2 = scan.nextLine();
即刻。 当我调试时,s2是空的。
为了#2:
i2 = scan.nextInt();
s2 = scan.nextLine();
d2 = scan.nextDouble();
结果:编译器这次等待输入i2和s2 。 当我给输入hello
它会引发错误。
1
hello
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at HelloWorld.main(HelloWorld.java:18)
为了#3:
s2 = scan.nextLine();
i2 = scan.nextInt();
d2 = scan.nextDouble();
结果:工作正常!
那么为什么订单在这里扮演角色?
执行中的差异,在订单的变化,是由于这样的事实,即新的行 不被消耗nextInt()
nextDouble()
next()
或nextFoo()
方法。
因此,无论何时在任何这些方法之后发出对nextLine()
的调用,它都会消耗该换行符 ,并且实际上跳过该语句 。
解决方法是简单的,不使用nextFoo()
方法前nextLine()
试试: -
i2 = Integer.parseInt(scan.nextLine());
d2 = Double.parseDouble(scan.nextLine());
s2 = scan.nextLine();
否则,你可以通过消费新线
i2 = scan.nextInt();
d2 = scan.nextDouble();
scan.nextLine(); //---> Add this before the nextLine() call
s2 = scan.nextLine();
顺序#3工作正常,因为nextLine()
是第一条语句,因此没有要使用的剩余字符。
相关:扫描程序在使用next(),nextInt()或其他nextFoo()方法之后跳过nextLine()
尝试调用next()
而不是nextLine()
来读取String。