我正在尝试让扫描仪在循环中接收输入。一旦用户想要完成,他就可以退出这个循环。我尝试了很多不同的方法,但总有一些问题。这是代码:
private void inputEntries() {
Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number = sc.nextInt();
Student student = new Student(name, surname, number);
students.add(student);
try {
addToFile(student);
} catch (Exception ex) {
Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Continue?[Y/N]");
}
}
上面代码的问题,也发生在我尝试的不同方法上,当用户键入 Y 时,Scanner
将跳过第一个名字输入,并且跳到姓氏。如果用户键入 N ,则循环正确停止。有人可以解释这种情况发生的原因,以及如何克服使用Scanner
类?
p.s:做while(sc.nextLine().equals("Y"))
之类的事情会导致循环在首次运行循环后从用户那里获得输入之前终止。
答案 0 :(得分:9)
这是因为您使用的是Scanner#next
方法。如果查看该方法的文档,它将返回下一个标记读取。
因此,当您使用next
方法读取用户输入时,它不会在最后读取newline
。然后由nextLine()
循环内的while
读取。因此,firstName
在您不知情的情况下包含newline
。
因此,您应该使用nextLine()
而不是next()
。
与nextInt
方法类似。它也不会读取换行符。因此,您可以read
使用readLine
并使用int
将其转换为Integer.parseInt
。如果输入值无法转换为NumberFormatException
,则可以抛出int
。所以你需要相应地处理它。
您可以尝试以下代码: -
Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number = 0;
try {
number = Integer.parseInt(sc.nextLine());
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
System.out.println("Continue?[Y/N]");
}
但是,请注意,如果您输入的值无法传递给Integer.parseInt
,您将获得异常,并且将跳过该输入。对于这种情况,您需要使用while
循环来处理它。
或者,如果您不想进行异常处理: -
您可以在empty sc.nextLine()
之后添加sc.nextInt()
,这将消耗剩下的newline
,如下所示: -
// Left over part of your while loop
String surname = sc.nextLine();
System.out.println("Enter number");
int number = sc.nextInt();
sc.nextLine(); // To consume the left over newline;
System.out.println("Continue?[Y/N]");
答案 1 :(得分:4)
equalsIgnoreCase(..)
来防止 Y 或 N 为小写,反之亦然。sc.next()
代替sc.nextLine()
来实现您的目标,因为next()
只会在nextLine()
读取到下一个\n
时读取下一个空格nextInt()
1}}休息。String
将所有数据都读为nextInt()
然后进行转换,因为next()
与Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
System.out.println("Enter first name");
String name = sc.nextLine();
System.out.println("Enter surname");
String surname = sc.nextLine();
System.out.println("Enter number");
int number=0;
try {
number = Integer.parseInt(sc.nextLine());//read int as string using nextLine() and parse
}catch(NumberFormatException nfe) {
nfe.printStackTrace();
}
System.out.println("Continue?[Y/N]");
}
类似,因此无法读取到下一个 \ ñ 试试这样:
{{1}}
答案 2 :(得分:1)
您可以使用
String abc = "abc";
String answer = "null";
while (abc.equals("abc")
{
if (answer.equals("n")
{
break;
}
while (answer.equals("y"))
{
//Put your other code here
System.out.print("Continue? [y/n]")
answer = input.nextLine();
if (answer.equals("n")
{
break;
}
}
}
当输入
时,应该停止程序"n"
您还必须像这样导入和创建扫描仪:
//This is how you import the Scanner
import java.util.Scanner;
//This is how you create the Scanner
Scanner input = new Scanner(System.in);
/**
*The name
*/
"input"
/**
*is used because of
*/
input.nextLine
答案 3 :(得分:1)
public void display() {
int i, j;
for (i = 1; i <= 5; i++) {
for (j = i; j < 5; j++) {
System.out.print(" ");
}
for (j = 1; j < (2 * i); j++) {
System.out.print(i % 2);
}
for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
System.out.print(" ");
}
for (j = 1; j < (2 * i); j++) {
System.out.print(j);
}
System.out.println();
}
for (i = 4; i >= 1; i--) {
for (j = i; j < 5; j++) {
System.out.print(" ");
}
for (j = 1; j <= i; j++) {
System.out.print(j);
}
for (j = i - 1; j >= 1; j--) {
System.out.print(j);
}
for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
System.out.print(" ");
}
for (j = 1; j < (2 * i); j++) {
System.out.print(j);
}
System.out.println();
}
}