为什么这段代码的第二行会抛出ArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
虽然这有效:
String driveLetter = filename.split("/")[0];
我使用 Java 7。
为什么这段代码的第二行会抛出ArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
虽然这有效:
String driveLetter = filename.split("/")[0];
我使用 Java 7。
如果要在文字点上拆分,则需要转义该点:
String extensionRemoved = filename.split("\\.")[0];
否则,您将在 regex 上进行拆分.
,这意味着“任何字符”。
请注意在正则表达式中创建单个反斜杠所需的双反斜杠。
你得到一个,ArrayIndexOutOfBoundsException
因为你的输入字符串只是一个点,即"."
,这是一个边缘情况,当在点上分割时会产生一个空数组;split(regex)
从结果中删除所有尾随空格,但是由于在一个点上拆分一个点只留下两个空格,因此在删除尾随空格后,您将得到一个空数组。
为避免出现ArrayIndexOutOfBoundsException
这种极端情况,请使用 的重载版本split(regex, limit)
,它有第二个参数,即结果数组的大小限制。当limit
为负数时,从结果数组中删除尾随空格的行为被禁用:
".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
即,当filename
只是一个点时"."
,调用filename.split("\\.", -1)[0]
将返回一个空白,但调用filename.split("\\.")[0]
将抛出一个ArrayIndexOutOfBoundsException
.
点“。” 是java正则表达式引擎中的一个特殊字符,所以你必须使用“\\。” 转义这个字符:
final String extensionRemoved = filename.split("\\.")[0];
这是因为.
是正则表达式中的保留字符,代表任意字符。相反,我们应该使用以下语句:
String extensionRemoved = filename.split("\\.")[0];
我相信你应该逃避这个点。尝试:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
否则点被解释为正则表达式中的任何字符。