为什么这段代码的第二行抛出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。
其他回答
这是因为。正则表达式中的保留字符,表示任何字符。 相反,我们应该使用以下语句:
String extensionRemoved = filename.split("\\.")[0];
如果你想在文字点上进行分割,你需要转义点:
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。
我认为你应该逃避现实。试一试:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
否则,点将被解释为正则表达式中的任何字符。
点"."在java regex引擎中是一个特殊字符,所以你必须使用"\\."来转义这个字符:
final String extensionRemoved = filename.split("\\.")[0];