今天做题,踩到了Scanner类中的一个坑,有点小无语,故此小结一番。
尽管遗忘的东西越来越多,但我并不想把所有东西都还给老师,嘿嘿,下面进入正题。
Scanner类存在于Java中的java.util包,相信很多人对它都不陌生。
在IDE中,每当我们需要从控制台通过键盘输入东西时,就要用到它了。
这个类中,我们常用的几个方法有next()、nextLine()、hasNext()、hasNextLine()、nextInt()、hasNextInt()
等。
为了好区分,我把这几个方法分成两个部分,第1部分是类似 nextXxx()
格式的方法,而第2部分则是类似 hasNextXxx()
格式的。
第1部分 nextXxx()方法
1. 简 介
(1)nextXxx()
格式的方法,主要用来获取在控制台输入的值。
(2)nextXxx()
格式的方法涵盖的数据类型主要包括以下几种:
- String类型:next()、nextLine()、next(Pattern pattern)、next(String pattern)
- byte类型:nextByte()、nextByte(int radix)
- short类型:nextShort()、nextShort(int radix)
- int类型:nextInt()、nextInt(int radix)
- long类型:nextLong()、nextLong(int radix)
- float类型:nextFloat()
- double类型:nextDouble()
- boolean类型: nextBoolean()
- BigDecimal类型:nextBigDecimal()
- BigInteger类型:nextBigInteger()、nextBigInteger(int radix)
下面通过具体的代码来演示一下。
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
int i = scanner.nextInt();
double d = scanner.nextDouble();
System.out.println("这是一个字符串:"+string);
System.out.println("这是一个整数:"+i);
System.out.println("这是一个小数:"+d);
scanner.close();
}
}
从程序的运行结果,可以看到,当我们在控制台连续输入helloWorld、20、101.25三个输入项时,每个值都能被获取到,并且根据代码重新正确地输出到控制台。
在这么多种数据类型的方法中,我们常用的主要还是String类型和int类型的方法,掌握了这两种,其它的可以说是大同小异,不足为虑。
2. String类型next()、nextLine()方法的区别与联系
(1)这两个方法都是属于String类型的方法,都可以用来获取在控制台输入的字符串。
(2)next()
方法获取的是没有被空格、换行、回车符
隔断的连续字符串。
(3)nextLine()
方法获取的是在回车符
之前,所输入的一整行字符串,回车符
作为分割点,空格、换行符
没有影响。
示例1,演示next()
方法,分别没有空格和有空格进行隔断的字符串获取情况
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个没有空格的字符串:");
String string1 = scanner.next();
System.out.println("输入一个没有空格的字符串后,得到的结果:"+string1);
System.out.println();
System.out.println("===================分隔线========================");
System.out.println();
System.out.print("请输入一个有空格的字符串:");
String string2 = scanner.next();
System.out.println("输入一个有空格的字符串后,得到的结果:"+string2);
scanner.close();
}
}
从运行结果可以看到,当输入不带空格的字符串“thisIsMyHome
”时,next()方法获取到的是敲下回车键之前输入的“thisIsMyHome
”;而当输入带空格的字符串“this Is My Home
”时,next()方法最后得到的是一个“this
”,后面的字符串由于被空格隔断,并没有获取到。
示例2,演示nextLine()
方法,分别没有空格和有空格进行隔断的字符串获取情况
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个没有空格的字符串:");
String string1 = scanner.nextLine();
System.out.println("输入一个没有空格的字符串后,得到的结果:"+string1);
System.out.println();
System.out.println("===================分隔线========================");
System.out.println();
System.out.print("请输入一个有空格的字符串:");
String string2 = scanner.nextLine();
System.out.println("输入一个有空格的字符串后,得到的结果:"+string2);
scanner.close();
}
}
从程序运行结果可以看到,无论输入的字符串有没有空格,nextLine()
方法都会将敲下回车键之前输入的字符串全部获取到,并返回输出到控制台。
3. int类型nextInt()、nextInt(int radix)方法的区别与联系
(1)nextInt()
方法:获取一个从控制台输入的整数。如果输入的数字不是int型,会报错;如果数字之间被空格隔开,此时与next()
方法类似,会获取第一个空格之前的数字。
用个示例演示一下:
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
int i = scanner.nextInt();
System.out.println("得到的结果是:"+i);
scanner.close();
}
}
(2)nextInt(int radix)
方法:括号中的int radix
代表的是读入数字的进制,比如2进制、8进制、10进制、16进制,代表进制的选择,如果为空,默认是10进制。方法执行完成后,读入的数字会转换成10进制的数字进行返回。
用实际示例演示一下:
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
int i = scanner.nextInt(2); //2表示读入的是二进制数
System.out.println("得到的结果是:"+i);
scanner.close();
}
}
注意点:我们从控制台输入的内容,其实都是以字符串形式输入的,对于像nextInt()
这样的方法,为什么能得到int类型数值,那是因为方法的底层做了一个将String类型转为int类型的处理。
其它基本数据类型的方法,和int型的很相似,在此不再赘述。
第2部分 hasNextXxx()方法
1. 概 述
(1)hasNextXxx()
格式的方法,返回值都是布尔(boolean)类型的,这意味着,这些格式的方法,基本是用来做判断,检测是否有输入项的。
(2)通过对比可以发现,hasNextXxx()
格式的方法与nextXxx()
格式的方法,仅仅是一个has的问题,所以在涵盖的数据类型方面,两者基本一致。
- 对于String类型的判断:hasNext()、hasNextLine()、hasNext(Pattern pattern)、hasNext(String pattern)
- 对于byte类型的判断:hasNextByte()、hasNextByte(int radix)
- 对于short类型的判断:hasNextShort()、hasNextShort(int radix)
- 对于int类型的判断:hasNextInt()、hasNextInt(int radix)
- 对于long类型的判断:hasNextLong()、hasNextLong(int radix)
- 对于float类型的判断:hasNextFloat()
- 对于double类型的判断:hasNextDouble()
- 对于boolean类型的判断: hasNextBoolean()
- 对于BigDecimal类型的判断:hasNextBigDecimal()
- 对于BigInteger类型的判断:hasNextBigInteger()、hasNextBigInteger(int radix)
用个示例演示一下hasNextInt()
方法:
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean aa = scanner.hasNextInt();
if (aa) {
System.out.println("输入正确!");
}else {
System.out.println("输入错误!");
}
scanner.close();
}
}
从上面的结果可以看到,第一次,输入一个this,报了输入错误;第二次,输入85,则提示输入正确。这说明hasNextInt()
方法会先对输入的数据进行数据类型判断,如果得到的是int类型,则返回true给到aa,否则返回false。
其它方法也是类似的,不再做其它演示。
2. hasNextXxx()方法的使用
(1)以hasNextInt()
作为代表,演示一下数值类型方法的使用
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextInt()) {
int i = scanner.nextInt();
System.out.println("输入的值是:" + i);
}
scanner.close();
}
}
在实际应用中,hasNextInt()
经常与nextInt()
结合使用,前者用作判断,后者用来获取从控制台输入的值。
在这里需要明白的是:
1)当我们执行代码时,hasNextInt()
会先检测控制台是否是空的,如果是空的,则让我们先输入一个值;
2)hasNextInt()
对我们输入的值进行判断,如果结果是true,则将得到的实际数值保存到缓存中,然后将方法执行结果true返回,接着执行while循环中的代码;(下图是hasNextInt()
方法源码)
3)当执行到int i = scanner.nextInt();
这行代码时,理论上是要我们在控制台输入一个值,然后nextInt()
方法获取到,接着赋值给i
。从上面的结果,我们可以看到,nextInt()
方法获取到的值,其实是我们在hasNextInt()
方法做判断时输入的值。原因是nextInt()
方法会先从缓存中看看有没有值,如果有就直接获取,没有再要求从控制台输入。(nextInt()
方法源码如下)
(2)hasNext()
与hasNextLine()
方法
这两个方法对于输入流的检测存在差异:
hasNext()
方法以检测接下来是否还有非空字符为主,如果有则返回true,否则falsehasNextLine()
方法,从名字可以推测,是以行的方式去判断的,即判断接下来是否还有一行(\n空行也被当作一行),如果有则返回true,反之返回false
在使用时,最好是hasNext()
与next()
方法搭配使用,hasNextLine()
与nextLine()
方法搭配使用。
示例如下:
package com.org.example;
import java.util.Scanner;
public class TestExam {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String string = scanner.next();
System.out.println("输入的值是:" + string);
}
// while(scanner.hasNextLine()) {
// String string = scanner.nextLine();
// System.out.println("输入的值是:" + string);
// }
scanner.close();
}
}
小结
1、无论是nextXxx()
方法还是 hasNextXxx()
方法,两者都具有读取控制台输入的能力,也就是说,都可以单独读取我们输入的值。
2、无论是使用nextXxx()
还是hasNextXxx()
,在控制台输入完输入项,然后按 回车 ,都是我们结束输入的方式,这对这二者都适用。
3、nextXxx()
方法主要用来获取从控制台输入的数值,然后用该数值进行一些其它的操作;而hasNextXxx()
方法更多的是用来做判断,判断是否还是输入项。