小编典典

Java 字符串用“.”分割 (点)

all

为什么这段代码的第二行会抛出ArrayIndexOutOfBoundsException

String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];

虽然这有效:

String driveLetter = filename.split("/")[0];

我使用 Java 7。


阅读 99

收藏
2022-03-16

共1个答案

小编典典

如果要在 文字 点上拆分,则需要转义该点:

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.

2022-03-16