当前位置: 首页 > 知识库问答 >
问题:

不同类型输入的不同Java Scanner

祁星阑
2023-03-14

想象一下下面的scanario:我有一个程序,它要求输入一个整数,然后是一个String输入。

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中的几个问题提到了多扫描仪,但他们的问题只使用了一个扫描仪对象,所以我今天问这个问题。)

共有3个答案

方飞白
2023-03-14

您应该在扫描的每个对象上只使用一个Scanner实例。在这种情况下,您正在读取System.in,因此同时在同一个扫描仪上打开两个扫描仪甚至没有意义。

所以你肯定想用你的第一个选择,那么问题来了,它有什么问题:

好吧,你要求sc。nextInt(),整数,名称很少是整数。您很可能会为一个单词查找name=sc.next(),或为整个句子查找 name=sc.nextLine()(直到按下enter键)。

还要注意,在< code>sc.nextInt()之后,实际上在任何< code>sc.next***()之后,都需要按< kbd>Enter。

贲骏喆
2023-03-14

您没有机会输入名称,因为< code>nextInt()不读取新行字符< code>'\n'(由用户在按下< kbd>Enter后输入),而< code>nextLine()可以。所以只要一调用< code > name = sc . nextline();,它将只读取< code>'\n'字符,而< code>nextInt()尚未读取该字符。

如果您正在扫描相同的东西(如< code>System.in),则绝对不要创建新的扫描仪-只有在扫描其他东西(如不同的文件或其他东西)时才更换扫描仪。

要让您的代码工作(仅使用一个Scanner实例),请使用以下命令:

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
国景铄
2023-03-14

@skiwi关于只使用一个< code >扫描仪的说法是正确的,所以你这样做是对的。它不起作用的原因是< code>nextInt()消耗组成整数的所有字符,但它不触及行尾字符。所以当调用< code>nextLine()时,它看到行尾字符之前没有字符,所以它认为输入了一个空行,而您得到的是一个空字符串。但是,< code>nextLine()确实消耗了行尾字符,所以如果调用< code > sc . nextLine();在执行< code>name = sc.nextLine()之前执行一次;,应该可以。

 类似资料:
  • 对于下面的代码,我得到了不同的输出 输出为: 现在美国/洛杉矶是GMT-8/UTC-8或PST。但当我将参数从GMT-8改为America/Los_Angeles时, 输出为: 不能使用类似PST的缩写,因为它已被弃用。同时,CST可以指中央标准时间和中国标准时间。 我的输入是-8、-9-14等,我希望在GMT/UTC之前知道我是否可以在给定日期获得DST激活。 请在这方面指导我。

  • 我有一个这样的方法,它通常用于返回。 在最后一行,我从Pylance那里得到了以下信息: (方法)is_file:()- 有没有一种方法可以正确地键入提示这种情况,以便Pylance知道是?或者我应该让它总是返回路径,并有另一个方法调用将输出转换为字符串,然后返回? 谢谢 编辑1 我刚刚意识到另一个更常见的场景: 在熊猫中,输入参数可以改变输出类型,Pylance也不能处理这个问题。Pylance

  • 我需要编写一个java方法来从一个对象中获取特定的信息。但是,该对象可以是A类型的,也可以是B类型的。下面是我的代码的一部分: 当我这样写它时,它会引发一个错误,说“重复方法”。我怎么才能让这个起作用?

  • 我有一个棘手的问题要解决。我使用系统。方法调用之前和之后的currentTimeMillis(),因为我必须测量这两条语句之间经过的时间。 我担心的是每次运行程序都会得到不同的结果。 我明白了(这很完美): 几秒钟后,我再次运行程序,我得到(这是错误的): 我说这个输出是错误的,因为每辆车的等待时间不应该少于100毫秒。 什么实际影响基于currentTimeMillis函数的时间计算? 为什么我

  • 我正在使用TypeORM和NestJs处理现有的MySql数据库。有一个共享表,我必须将记录插入其中,它有一个自动递增的主键。由于该表是共享的,因此已禁用“同步”。 当我使用@PrimaryGeneratedColumn装饰器设置TypeForm实体时,我得到一个错误,指出该列“没有默认值”。如果我将decorator更改为@Column,那么我将收到一个关于没有主键的错误。 谁能告诉我应该如何设

  • 问题内容: 我设置了logstash以使用嵌入式elastisearch。 我可以记录事件。 我的logstashconf看起来是这样的:https://gist.github.com/khebbie/42d72d212cf3727a03a0 现在,我想添加另一个udp输入,并在另一个索引中对该输入进行索引。 有可能吗?我这样做是为了使报告更加容易,因此我可以在一个索引中包含系统日志事件,而在另一