【Pre】Exercise Log
Pre2
#Task1
测评机(Java8)不支持enhanced Switch
。
Switch中,将case后的:
改为->
后,将会取消fall through,可以删去break;
#Task4
疏忽强转溢出的可能性
重写Equipment类的compareTo()
时,对于price的比较直接使用了return (int) (this.price - other.price)
,然而long减long可能超过int范围导致溢出错判。
运用异常处理机制
#Task5
关于接口和接口引用的理解
Pre3
#Task1
Java8 不支持 String.isBlank()
。改成 String.trim().isEmpty()
#Task3
正则表达式括号与捕获组
括号本身既区分优先级,又形成捕获组
例:捕获字符串中可能出现的receiver(形如“@某用户”)
目标表达式 regexp
= ((@[a-zA-Z0-9]+)?)
会分出两个捕获组。Matcher.find()始终为true;若不存在@[a-zA-Z0-9]
则Matcher.group(1)返回""
,Matcher.group(2)返回null
可以分别为group #1
/group #2
命名为"receiver"
:
(?<receiver>(@[a-zA-Z0-9]+)?)
((?<receiver>@[a-zA-Z0-9]+)?)
正则表达式的包含关系导致无法匹配
public static final String DATE_PATTERN = "(?<year>\\d{1,4})" + "/" +
"(?<month>\\d{1,2})" + "/" + "(?<day>\\d{1,2})";
public static final String SENDER_PATTERN = "(?<sender>-[a-zA-Z0-9]+)";
public static final String RECEIVER_PATTERN = "((?<receiver>@[a-zA-Z0-9]+)?)";
public static final String MESSAGE_PATTERN = DATE_PATTERN + ".*"
+ SENDER_PATTERN + "[^@]*" + RECEIVER_PATTERN;
// 第二处连接若使用".*"则使用时将无法匹配RECEIVE_PATTERN
关于String.split()返回数组不定长
由于使用了SCANNER.next()
,用String.split("\")
分割"y\m\d"时,若读取值为"\"、"2021\"等时,数组长度不为3,与年月日匹配方法不符产生异常。
解决:创建长度3的数组来定长。使用System.arraycopy(Object[] src, int srcPos, Object[] dest, int destPos, int length)
,直接从内存拷贝数组。