【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]+)?)

image

会分出两个捕获组。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),直接从内存拷贝数组。

posted @ 2022-03-01 14:55  Elucidator_xrb  阅读(8)  评论(0编辑  收藏  举报