Day11-Scanner
Day11-Scanner
Scanner介绍
Scanner 对象:
之前我们学的基本语法中我们并没有实现程序和人的交互,但是 Java 给我们提供了这样一个工具类,我们可以获取用户的输入。
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。
基本语法:
Scanner s = new Scanner(System.in);
通过 Scanner 类的 next()与 nextLine()方法获取输入的字符串:在读取前我们一般需要使用 hasNext()与 hasNextLine()判断是否还有输入的数据。
java.util.Scanner 的解读:
“java.util.Scanner” 是 Java 编程语言中的一个类。
“java.util” 是 Java 标准库中的一个包(package)名称,这个包中包含了很多实用的工具(utility)类和接口。
“Scanner” 是其中的一个类,它主要用于从标准输入(通常是键盘输入)、文件等来源中读取数据。它提供了方便的方法来解析各种基本数据类型和字符串。
next()与 nextLine()方法分别的用法
一、next()方法
-
next()方法会从输入流中读取下一个单词(以空白字符分隔)。 -
它会在遇到空白字符(如空格、制表符、换行符等)时停止读取,并返回当前读取到的内容。
-
假设用户输入 “hello world”,
next()方法只会读取到 “hello”,因为它在遇到第一个空白字符时就停止了读取。流程: 先接收,再判断,最后是关闭
示例:
创建scanner对象,判断是否有输入的字符串,输出 输入的内容
//创建一个扫描器对象,用于接收键盘数据 Scanner scanner = new Scanner(System.in); System.out.println("使用next方法接收:"); //判断用户有没有输出字符串 if(scanner.hasNext()){ //使用next方法接收——接收单个单词关闭 String str=scanner.next(); //程序会等到用户输入 System.out.println("输入的内容为:"+str); } //属于IO流的类,用完就关闭,否则一直占用资源!!!!!!!!!!!! scanner.close();//关闭输入Hello world时,只输出一个Hello
使用next方法接收: Hello world 输入的内容为:Hello注意事项:
在 Java 中,变量名的大小写是敏感的。
在这段代码中,
Scanner scanner = new Scanner(System.in);这里定义了一个变量名为scanner,使用小写字母开头。这是遵循 Java 中变量命名的一般规范,通常变量名以小写字母开头,多个单词组成时,后续单词首字母大写(驼峰命名法)。而在代码中其他地方如果出现大写的
Scanner,那是在引用类名本身。比如在创建对象的语句中new Scanner(System.in),这里的Scanner是指java.util.Scanner这个类,必须使用正确的类名来创建对象。总结来说,小写的
scanner是一个特定的对象变量名,而大写的Scanner是在引用类的名称以进行对象的创建等操作。
二、nextLine()方法
nextLine()方法会读取输入流中的一整行内容,包括空白字符。- 它会读取到当前行的末尾(换行符处),并返回包括换行符之前的所有字符。
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextline方法接收:");
if(scanner.hasNextLine()){
String str = scanner.nextLine();
System.out.println("输出的结果为:"+str);
}
scanner.close();
hasNext()
在 Java 中,Scanner类的hasNext()方法用于判断输入流中是否还有下一个输入项(token)。
具体解释如下:
一、返回值及用途
- 返回值类型:这个方法返回一个布尔值。如果输入流中还有下一个输入项可读取,它就返回
true;如果没有更多的输入项可读取,它就返回false。 - 常见用途:通常在一个循环中使用这个方法来不断检查是否有更多的输入,以便决定是否继续读取输入。
二、输入项的概念
- 定义:输入项是指通过输入流提供的、以分隔符(如空格、换行符等)分隔的一块数据。具体的分隔规则取决于
Scanner的构造方式和默认的分隔模式。 - 示例:如果用户在控制台输入 “hello world”,这里面的 “hello” 和 “world” 可以分别被看作两个输入项。如果输入的是一个整数,那么这个整数就是一个输入项。
三、与其他方法配合使用
- 与
next()方法配合:通常在使用next()方法读取输入项之前,先使用hasNext()方法进行判断,以确保不会在没有输入项可读取时调用next()方法而导致异常。
遇见某一个类,选中,按住Ctrl键,单击鼠标,就进入了类的源代码
实际应用:判断输入的是不是整数/小数
Scanner scanner = new Scanner(System.in);
//从键盘接收数据
int i1=0;
float i2=0.0f;
System.out.println("请输入整数:");
if(scanner.hasNextInt()){
i1 = scanner.nextInt();
System.out.println("输入的整数是:"+i1);
}else {System.out.println("你输入的不是整数");}
//!!!!!!!!!!!!!!!!!!!!!!
//下面的这段代码有问题,当输入1的时候,输出结果为 输入的小数是:1.0
System.out.println("请输入小数:");
if(scanner.hasNextFloat()){
i2 = scanner.nextFloat();
System.out.println("输入的小数是:"+i2);
}else {System.out.println("你输入的不是小数");}
scanner.close();
/*
当输入一个整数时,hasNextDouble()方法也会返回true,因为整数可以被自动转换为小数。因为整数转换为浮点数自动转换
*/
易出错的地方:
错误1-----------------------------
//判断输入的是不是小数
Scanner scanner = new Scanner(System.in);
System.out.println("请输入小数:");
if(scanner.hasNextDouble()){
double a= scanner.nextDouble();
System.out.println("输入的小数是:"+a);
}else {
System.out.println("这个书不是小数");
}
Scanner close;
//输入的是12345,是一个整数,应该输出的是"这个书不是小数",但是输出的是12345.0。
//出错了!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//当你在Java中使用Scanner类的nextDouble()方法来读取输入时,即使用户输入的是一个整数值(如 12345),这个方法也会将它当作双精度浮点数(double)来读取和处理。这意味着,无论输入的是整数还是真正的小数,只要它是有效的数值,都会被当作带有小数点的格式存储在 double 变量中。因此,整数 12345 会被读入并显示为 12345.0。
错误2--------------------------------------------------下面的代码对5.0这样的数无效
//解决思路:如果你想要区分用户输入的是整数还是小数,就需要在读取之后做一些额外的检查,比如比较该值是否与其强制转换为 int 类型的值相等。如果两者相等,则说明输入的是一个整数;否则,就是一个小数。-------
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数:");
if (scanner.hasNextDouble()) {
double input = scanner.nextDouble();
// 如果input和它的整数部分相等,那么它就是一个整数
if (input == (long) input) {
System.out.println("这个数不是小数");
} else {
System.out.println("输入的小数是:" + input);
}
} else {
System.out.println("输入的不是一个有效的数字!");
}
scanner.close();
}
}
实际应用:将输入的数据求和、求平均值
//我们可以输入多个数字,并求其总和与平均数。每输入一个数字用回车确认。通过输入-999数字来结束输入并输出执行结果。
//下面的代码有问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Scanner scanner = new Scanner(System.in);
System.out.println("请输入:");
//和
double sum=0;
//有多少个数
int num=0;
//通过循环判断是否有数字,并进行求和和数量统计
while(scanner.hasNextDouble()){
sum+=scanner.nextDouble();
num=num+1;//num++
System.out.println("你输入了第"+num+"个数,当前的和是"+sum);
}
System.out.println(num+"个数的和是"+sum);
System.out.println(num+"个数的平均数:"+(sum/num));
scanner.close();
//不过确实存在一个问题,就是当用户输入结束后,没有合适的方式来跳出循环。
目前代码中使用 while (scanner.hasNextDouble()) 作为循环条件,它会一直等待并判断是否还有下一个可解析为双精度浮点数的输入。但在实际使用场景中,用户需要有一个明确的方式来告知程序输入结束了,不然程序就会一直处于等待输入的状态,无法输出最终的求和以及平均值结果。
正确的代码:
//实际应用:将输入的数据求和、求平均值
Scanner scanner=new Scanner(System.in);
System.out.println("请输入:");
double sum=0;
int num=0;
double i=0;
while(scanner.hasNextDouble()){
i=scanner.nextDouble();
if(i==-999){
break;
}
num+=1;
sum+=i;
}
if(num>0){
System.out.println("输入的数字总数是:"+num);
System.out.println("输入的数字平均数是:"+(sum/num));
}else {
System.out.println("没有输入任何有效的数字(或只输入了-999)");
}
scanner.close();
拓展:
在 Java 集合框架中,Iterator接口用于实现迭代器功能,它定义了一系列方法如hasNext()用于判断是否还有下一个元素,next()用于获取下一个元素等,
迭代器(Iterator)是一种设计模式,用于遍历一个容器(如集合类)中的元素。它提供了一种统一的方式来访问容器中的各个元素,而不需要了解容器的内部结构。

浙公网安备 33010602011771号