想象一下以下场景: 我有一个程序要求输入整数,然后输入字符串。
int age=0;
String name;
Scanner sc = new Scanner(System.in);
System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc.nextLine();
使用 aobe 代码时,我没有机会输入名字。所以通常我会声明 2 个扫描仪对象,如下所示:
int age=0;
String name;
Scanner sc = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in); //2nd Scanner object
System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc2.nextLine(); //Using 2nd Scanner Object
我的问题是:是否有必要声明多个扫描仪对象来接受不同类型的输入?我的做法是否正确?
这个问题我已经记在心里很多年了。 (SO中的几个问题提到了多个扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天问这个。)
@skiwi 只使用一个
Scanner
是正确的,所以你做得对。它不起作用的原因是 nextInt()
消耗了组成整数的所有字符,但它不触及行尾字符。因此,当调用 nextLine()
时,它会发现行尾字符之前没有字符,因此它认为输入了一个空行,并且返回一个空字符串。但是, nextLine()
确实会消耗行尾字符,因此如果您在执行 sc.nextLine();
之前调用 name = sc.nextLine();
一次,它应该可以工作。
您没有机会输入名称,因为
nextInt()
不会读取换行符 '\n'
(用户按 Enter 后输入),而 nextLine()
会读取。因此,一旦您调用 name = sc.nextLine();
,它就会读取 '\n'
尚未读取的 nextInt()
字符。
如果您正在扫描相同的内容(例如
System.in
),则绝对不要创建新的扫描仪 - 仅当您正在扫描其他内容(例如不同的文件或其他内容)时才更改扫描仪。
要使您的代码正常工作(仅使用一个扫描仪实例),请使用以下命令:
int age = 0;
String name;
Scanner sc = new Scanner(System.in);
System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
sc.nextLine(); // "dispose" of the '\n' character
// so that it is not recorded by the next line
name = sc.nextLine();
// print your findings
System.out.println("------\nAge: " + age + "\nName: " + name);
输入/输出示例:
Enter Age: 17
Enter Name: Michael
------
Age: 17
Name: Michael
对于要扫描的每个对象,您只能使用一个
Scanner
实例。在这种情况下,您正在从 System.in
进行读取,因此同时在同一个扫描仪上打开两个扫描仪甚至没有意义。
所以你肯定想选择第一个选项,那么问题来了,它有什么问题:
好吧,你要求
sc.nextInt()
,一个整数,而名字很少是整数。您很可能正在寻找 name = sc.next()
来表示一个单词或 name = sc.nextLine()
来表示整个句子(直到按下回车键)。
还要注意,在
sc.nextInt()
之后,实际上在任何sc.next***()
之后,您需要按Enter。
您还可以使用:
name = sc.next();
这必须完美运行。我测试了一下。
int age=0;
String name;
Scanner sc = new Scanner(System.in);
System.out.print("Enter Age: ");
age = sc.nextInt();
System.out.print("Enter Name: ");
name= sc.nextLine();
为什么这段代码不起作用?
package Programs;
import java.util.Scanner;
public class LibraryManagement {
Scanner s = new Scanner(System.in);
String Sname, Bname, Bauthor;
int Sid,Sclass,Bid;
void StudInfo()
{
System.out.print("Enter the Student Id: ");
Sid=s.nextInt();
System.out.print("Enter the Student name: ");
Sname=s.nextLine();
System.out.print("Enter the Student Class: ");
Sclass=s.nextInt();
System.out.println("Student detail is saved: \n Id : "+ Sid + " Name : "+ Sname+ " Class : ");
}
public static void main(String[] args) {
LibraryManagement obj= new LibraryManagement();
obj.StudInfo();
}
}
输出是:
输入学号:10
输入学生姓名: 输入学生班级:
你可以通过进一步的例子来理解这一点。不能声明单个扫描器类来获取不同数据类型的输入。因此,在 Java 中获取输入时要具体。如果您要获取多个字符串输入,则为其创建一个特定的扫描器类,如果您要为 int 获取多个输入,则为其创建一个特定的扫描器类,这取决于不同的数据类型,如果您想获取输入然后在 char 中为其创建一个特定的扫描器类。它将帮助我们减少编写更多代码,因此如果您采用 10 个 int 输入,然后为其创建一个特定的扫描器类,并将这些单个扫描器类名称用于 10 个输入,基本上,这将减少我们为每个 int 输入编写 9 行更多代码,如果您要接受 10 个字符串输入,则为其创建一个特定的扫描器类,如果您要接受 10 个字符输入,则为其创建一个特定的扫描器类,依此类推......:) 这将减少为每种类型的输入编写代码。
代码
import java.util.*;
import java.lang.*;
import java.io.*;
public class arraylistExample {
public static void main(String[]args){
// This is a common scanner class for string type of inputs
Scanner stringcommonforall=new Scanner(System.in);
// This is a common scanner class for integer type of inputs
Scanner intcommonforall=new Scanner(System.in);
int size;
int pos=0;
boolean findornot=false;
String found;
ArrayList<String> name=new ArrayList<String>();
System.out.print("Enter the size of the ArrayList >> ");
size=intcommonforall.nextInt();
// when your are using one scanner for all types of input then you will get the error
for(int i=0;i<size;i++){
System.out.print(">> ");
name.add(stringcommonforall.nextLine());
}
System.out.print("Enter the element you want to search inside the arraylist >> ");
found=stringcommonforall.nextLine();
for(String i:name){
if(i.equals(found)){
findornot=true;
pos=name.indexOf(found);
break;
}
}
if(findornot==true){
System.out.println("The elements inside he arraylist >> "+name);
System.out.println("The element >> "+found+" is found at the positioin >> "+pos);
}
else{
System.out.println("The elements inside he arraylist >> "+name);
System.out.println("The element >> "+found+" is not found inside the arraylist ");
}
}
}
输出
Enter the size of the arraylist >> 5
>> lorem ipsum
>> xyz
>> zyx 1
>> june
>> done
Enter the element you want to search inside the arraylist >> done
The elements inside he arraylist >> [lorem ipsum, xyz, zyx 1, june, done]
The element >> done is found at the positioin >> 4
导入java.util.Scanner;
公开课测试{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i =0;
while (i<5) {
System.out.println("Enter the number");
int n = Integer.parseInt(sc.nextInt());
System.out.println("Enter the String");
String s = sc.nextLine();
i++;
}
}
}