我有以下代码,如果我在System.in.read()
之前使用Scanner
,则会遇到问题
然后通过跳过nextLine()
函数,光标在末尾移动。
import java.util.Scanner;
public class InvoiceTest{
public static void main(String [] args) throws java.io.IOException {
System.out.println("Enter a Charater: ");
char c = (char) System.in.read();
Scanner input = new Scanner(System.in);
System.out.println("Enter id No...");
String id_no = input.nextLine();
System.out.println("Charater You entered "+ c +" Id No Entered "+ id_no);
}
}
答案 0 :(得分:2)
在输入角色(System.in.read()
)时,您没有使用换行符,因此input.nextLine()
将使用它并跳过它。
<强>溶液强>
在读取id的输入之前先消耗新行字符。
System.out.println("Enter a Charater: ");
char c = (char) System.in.read();
Scanner input = new Scanner(System.in);
System.out.println("Enter id No...");
input.nextLine(); //will consume the new line character spit by System.in.read()
String id_no = input.nextLine();
System.out.println("Charater You entered "+c+" Id No Entered "+id_no);
}
答案 1 :(得分:1)
EJP评论如此:
不要将System.in.read()与新的Scanner(System.in)混合使用。使用其中一个。
好建议!
那么为什么在流中混合阅读并使用
Scanner
是一个坏主意?
好吧,因为Scanner
操作通常会在输入流上提前读取,将未使用的字符保留在内部缓冲区中。因此,如果您通过调用流上的Scanner
执行read()
操作后跟,则read()
很可能会(实际上)跳过超过人物。这种行为可能会令人困惑和不可预测......并且取决于输入字符实际来自何处。