Java 查缺补漏
Java Scanner
java.util.Scanner
是 Java5 的新特征,我们可以通过
Scanner 类来获取用户的输入。ACM 模式必备。
注意:JUnit
的测试方法(如@Test
)默认不会连接控制台(System.in
),一定要在main()
方法中运行。
Scanner 类的UML 图如下:
它实现了AutoCloseable
接口,可以使用try-with-resources自动关闭资源。
创建一个 Scanner 对象:
1 |
|
接收 String 类型输入:
next()
- 一定要读取到有效字符后才可以结束输入。
- 对输入有效字符之前遇到的空白,
next()
方法会自动将其去掉。 - 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next()
不能得到带有空格的字符串。
nextLine()
- 以Enter为结束符,也就是说
nextLine()
方法返回的是输入回车之前的所有字符。 - 可以获得空白
- 以Enter为结束符,也就是说
接收int
、long
类型的输入,可以使用nextInt()
、nextLong()
等。但是有以下几点要注意的地方:
- 这类方法不会消耗回车键产生的换行符,但是
nextLine()
会读取换行符,所以在二者混用的时候要注意:
1 |
|
控制台打印:
1 |
|
解释:输入123
,按下回车键的时候,123
赋值给了num
,与此同时line
接收到回车符,因此还没来得及输入一句话程序就结束了。
解决方法:在int num = scan.nextInt();
后面紧跟一个scan.nextLine()
,把回车吸收掉。
nextInt()
等接收特定数据类型不能接收其他类型的数据,否则运行时会报异常Exception in thread "main" java.util.InputMismatchException
,所以在接收数据之前最好使用hasNextInt()
判断输入的数据是否符合要求。nextInt
、next()
等都可以把空格作为分隔符,这样方便我们在一行内输入一个数组,比如对于下面这种输入格式
1 |
|
利用nextInt()
和适当的条件判断就能搞定。
测试类的命名
使用单元测试JUnit时,如果测试类的命名不规范,那么IDEA会报警告:
1 |
|
某些测试框架(如 Maven Surefire、JUnit、IDE 插件)会用正则表达式来自动识别哪些类是“测试类”。
上面这个正则表达式规定了测试类必须符合以下格式之一:
- 以大写字母开头,并以 Test、Tests 或 TestCase 结尾,如:
- LoginTest
- CalculatorTests
- NetworkTestCase
- 或者 以 Test 开头,如:
- TestLogin
- TestConnectionManager
- 或者包含 IT(通常代表集成测试):
- UserServiceIT
- ITLoginFlow
实用方法
split
定义:
1 |
|
作用:根据给定的正则表达式分割字符串。
参数
:定界正则表达式返回值
:根据给定的正则表达式分割得到的String[]
数组
举例:输入 IP
地址和子网掩码,输出网络地址和主机地址。第一步从给定的字符串中提取数字的过程可以用split
完成:
1 |
|
运行以下单元测试:
1 |
|
可见原字符串中的小数点已经被成功去掉,四个数字被转换成整型变量保存在了数组中。
小数点属于正则表达式中的特殊字符,.
用于匹配任意一个字符,想匹配它本身必须在前面加上\\
。所以必须用"\\."
来表示匹配小数点。类似的特殊字符还有:
字符 | 含义 | 匹配自身需写作 |
---|---|---|
. |
匹配任意单个字符(除换行) | \\. |
* |
匹配前面的内容零次或多次 | \\* |
+ |
匹配前面的内容一次或多次 | \\+ |
? |
匹配前面的内容零次或一次 | \\? |
^ |
匹配字符串的开头 | \\^ |
$ |
匹配字符串的结尾 | \\$ |
[ |
开始一个字符类 | \\[ |
] |
结束一个字符类 | \\] |
{ |
指定匹配次数(如 {3} ) |
\\{ |
} |
结束指定次数 | \\} |
( |
开始一个分组 | \\( |
) |
结束一个分组 | \\) |
\| |
逻辑“或” | \\\| |
\\ |
转义符本身 | \\\\ |