このコードの 2 行目がエラーをスローするのはなぜですかArrayIndexOutOfBoundsException
?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
これが機能している間:
String driveLetter = filename.split("/")[0];
私はJava 7を使用しています。
ベストアンサー1
リテラルドットで分割したい場合は、ドットをエスケープする必要があります。
String extensionRemoved = filename.split("\\.")[0];
それ以外の場合は、正規表現で分割され.
、「任意の文字」を意味します。
正規表現で単一のバックスラッシュを作成するには、二重のバックスラッシュが必要であることに注意してください。
ArrayIndexOutOfBoundsException
入力文字列が単なるドット、つまり であるため、が返されます。"."
これは、ドットで分割すると空の配列が生成されるエッジケースです。split(regex)
結果から末尾の空白をすべて削除しますが、ドットをドットで分割すると空白は 2 つしか残らないため、末尾の空白を削除すると空の配列が残ります。
このエッジケースでが発生しないようにするにはArrayIndexOutOfBoundsException
、オーバーロードされたバージョンのsplit(regex, limit)
には、結果の配列のサイズ制限を表す 2 番目のパラメータがあります。limit
が負の場合、結果の配列から末尾の空白を削除する動作は無効になります。
".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
つまり、filename
が単なるドットの場合"."
、 を呼び出すとfilename.split("\\.", -1)[0]
空白が返されますが、 を呼び出すとfilename.split("\\.")[0]
がスローされますArrayIndexOutOfBoundsException
。