Java基础语法(二)
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。 ——《道德经》
文章目录
十、用户交互 Scanner 类(引用数据类型)
-
从 Java 5 后引入 java.util.Scanner 这一个包,我们可以通过 Scanner 这一个类来获取用户的输入。
-
基本语法:
import java.util.Scanner; //使用Scanner需要先导包 ...... Scanner scanner = new Scanner(System.in);
-
通过 Scanner 类的 next() 和 nextLine() 方法获取输入的字符串,在读取前一般需要使用 hasNext() 或 hasNextLine() 判断是否还有输入的数据。
next(): 1.一定要读取到有效字符后才能结束输入。 2.对输入有效字符之前遇到的空白,next()方法会自动将其去掉。 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。 4.next()不能得到带有空格的字符串! nextLine(): 1.以 Enter 为结束符,即nextLine()方法返回的是输入回车之前的所有字符。 2.nextLine()可以获取空白!
-
用完 Scanner (或者其他 IO 流的类),如果不关闭会一直占用资源,所以用完就关闭是一个好习惯。
关闭 Scanner:
Scanner s = new Scanner(System.in); ...... s.close(); //关闭 Scanner
-
Scanner 的进阶使用。
hasNext() :用来是否还有输入的字符串 next() :用来接受控制台录入的字符串 hasNextInt() :用来是否还有输入的整数 nextInt() :用来接受控制台录入的整数 hasNextFloat() :用来是否还有输入的浮点数 nextFloat() :用来接受控制台录入的浮点数 hasNextDouble() :用来是否还有输入的浮点数 nextDouble() :用来接受控制台录入的浮点数
其中,hasNextFloat() 和 hasNextDouble() 功能基本相同,但特别的是,当控制台输入的不管是小数还是整数,这两个方法的结果都返回 true ,并且会把输入的整数变成小数。
而 hasNextInt() 只有在控制台输入的是整数才返回 true。
import java.util.Scanner;
public class demo01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = 0;
double d = 0.0;
if(scanner.hasNextInt()){
i = scanner.nextInt();
System.out.println("i = "+i);
}else{
System.out.println("输入的不是整数!");
}
if(scanner.hasNextDouble()){
d = scanner.nextDouble();
System.out.println("d = "+d);
}else{
System.out.println("输入的不是小数!");
}
scanner.close();
}
}
上述代码的三种结果:
1.输入整数:
20 //键盘输入
i = 20
20 //键盘输入
d = 20.0
2.输入小数:
3.14 //键盘输入
输入的不是整数!
d = 3.14
3.输入字符串(非数字)
hello //键盘输入
输入的不是整数!
输入的不是小数!
结果分析:
1.输入整数:
当输入第一个20时,由于输入的是整数,第一个20被scanner.nextInt()
接收并赋值给 i 并输出 i = 20。
此时程序 scanner.hasNextDouble()
等待控制台再次输入,所以再次输入第二个20,被scanner.nextDouble()
接收并赋值给 d 并输出 d = 20.0。
2.输入小数:
输入 3.14 时,由于不是整数,无法被scanner.nextInt()
接收并赋值,所以输出 “ 输入的不是整数!”。
由于输入的 3.14还没被接收,所以会继续给scanner.nextDouble()
判断和接收。
3.输入字符串:
输入字符串 hello 时,在整个程序中,既没被scanner.nextInt()
接收也没被scanner.nextDouble()
接收。
原因分析:
为什么输入整数,scanner.nextDouble()
返回 true 并且将整数转换为 double 类型的小数?
这就得对scanner.nextDouble()
的源码进行分析。(按住Ctrl键+点击源程序的scanner.nextDouble()
方法查看源代码)
Double.parseDouble()
是把括号里面String类型的内容变成double类型。
也就是说,当我们在控制台输入整数20时,它在程序中会先被转换为String 类型的字符串赋值给 s ,接着通过Double.parseDouble()
是把括号里面String类型的字符串 s 变成double类型然后返回,所以整数20就转换成了double类型的20.0。
为什么输入字符串,scanner.nextDouble()
返回 false?
这是因为源代码中 catch 抛出了一个NumberFormatException(数字格式化异常),查看字符串里面夹杂着string或者其他类型。当输入字符串时,便会返回 false 。所以,我们在使用控制台手动输入小数时,不能在小数后面加上 F 或 D ,否则报错。但是在程序中定义数字则可以。
十一、随机数类 Random(引用数据类型)(扩展)
Random类,它可以产生多种数据类型的随机数,在这里主要介绍生成整数与小数的方式。
-
public int nextInt(int maxValue) 产生 [0,maxValue) 范围的随机整数,包含0,不包含maxValue;
-
public double nextDouble() 产生 [0,1) 范围的随机小数,包含0.0,不包含1.0。
//Random 使用方法
import java.util.Random; //导包
......
//Random 变量名 = new Random();
Random r = new