为什么这段代码的第二行会抛出 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];
否则,你正在使用正则表达式 .
进行切割,它表示“任何字符”。请注意,需要双反斜杠才能在正则表达式中创建单个反斜杠。"."
时,您会收到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
异常。
ArrayIndexOutOfBoundsException
。话虽如此,你的回答是错误的:你不需要知道最后一个点在哪里;你只需要正确的正则表达式:filename.split("\\.(?=[^.]*$)")
。这个正则表达式使用了 前瞻 来断言在匹配点之后的输入中没有任何点。 - Bohemian在Java正则表达式引擎中,“.”是一个特殊字符,因此你需要使用“\\.”来转义这个字符:
final String extensionRemoved = filename.split("\\.")[0];
.
是一个保留字符,代表任何字符。因此,我们应该使用以下语句:String extensionRemoved = filename.split("\\.")[0];
我认为你应该转义这个点。尝试:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
否则点在正则表达式中被解释为任何字符。