Java:输入错误
当我将一个类的对象扫描程序用于两个用户定义类的对象时。编译器跳过一些输入获取行。如下文所述Java:输入错误,java,compiler-errors,Java,Compiler Errors,当我将一个类的对象扫描程序用于两个用户定义类的对象时。编译器跳过一些输入获取行。如下文所述 1) Scanner obj = new Scanner(System.in); 2) GradeBook book1 = new GradeBook(); 3) GradeBook book2 = new GradeBook(); //input for book1 4) variable1 = obj.nextInt(); 5) book1.variable1 = variable1; 6) v
1) Scanner obj = new Scanner(System.in);
2) GradeBook book1 = new GradeBook();
3) GradeBook book2 = new GradeBook();
//input for book1
4) variable1 = obj.nextInt();
5) book1.variable1 = variable1;
6) variable2 = obj.nextInt();
7) book1.variable1 = variable2;
8) variable3 = obj.nextInt();
9) book1.variable1 = variable3;
//input for book2
10) variable1 = obj.nextInt();
11) book2.variable1 = variable1;
12) variable2 = obj.nextInt();
13) book2.variable1 = variable2;
14) varibale3 = obj.nextInt();
15) book2.variable1 = variable3;
它跳过第10行(它不读取此行variable1=obj.nextInt();
)
但当我使用Scanner类的两个不同对象时,一个用于book1,另一个用于book2,那么它就可以正常工作了
问题是什么,为什么会这样
import java.util.Scanner;
public class GradeTest {
/**
* @param args
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
try{
Employee employee1 = new Employee();
Employee employee2 = new Employee();
String fName,lName;
double salary;
System.out.print("Enter first name:");
fName = input.nextLine();
employee1.SetFName(fName);
System.out.print("\nEnter last name:");
lName = inp.nextLine();
employee1.SetLName(lName);
System.out.print("\nEnter salary:");
salary = inp.nextDouble();
employee1.SetSalary(salary);
System.out.printf("\n1:Updated Value \n FName : %s LName : %s Salary : %.2f ", employee1.GetFName(),employee1.GetLName(),employee1.GetSalary());
Systm.out.println("Enter data for second employee. \n");
System.out.print("Enter first name:");
lName = input.nextLine();
employee2.SetFName(fName);
System.out.print("\nEnter last name:");
lName = input.nextLine();
employee2.SetLName(lName);
System.out.print("\nEnter salary:");
salary = input.nextDouble();
employee2.SetSalary(salary);
System.out.printf("\n2:Initial Value \n FName : %s LName : %s Salary : %.2f ", employee2.GetFName(),employee2.GetLName(),employee2.GetSalary());
}
finally{
inp.close();
}
}
}
预期产出:
Enter first name: First Name1
Enter last name: Last Name1
Enter salary: 1500.00
Enter data for second employee.
Enter first name: First Name2
Enter last name: Last Name2
Enter salary: 1200.00
实际产量:
Enter first name: First Name1
Enter last name: Last Name1
Enter salary: 1500.00
Enter data for second employee.
Enter first name:
Enter last name: Last Name2
Enter salary: 1200.00
这实际上是扫描器的工作原理。下面是它的工作原理: next()从流中获取输入,直到下一个定界符实例(默认为空白),并保留定界符。nextLine()最多使用下一个“\n”字符,丢弃换行符,并返回余数,余数可能为零 因此,如果执行next(),后跟nextLine(),并且用户在next()调用中只输入一个令牌,则流中剩下的将是next()不使用的“\n”字符。然后nextLine()取“\n”,这是唯一的内容,并将“\n”扔掉,然后返回“” 我知道,这是一个令人困惑的实现 tl;dr:使用nextLine()在next()之后清除
注意:nextInt()只是对next()的调用,后跟parseInt(),因此它在这方面的行为与next()完全相同 您是否在这些行之间使用了
obj.nextLine()
?您能显示实际输出与预期输出吗?发布一个可编译的代码示例,告诉我们输入、预期输出和实际输出。Daniel,JB Nizet检查更新后的帖子。