このコードの 2 行目で がスローされるのはなぜArrayIndexOutOfBoundsException
ですか?
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
これが機能している間:
String driveLetter = filename.split("/")[0];
私はJava 7を使用しています。
このコードの 2 行目で がスローされるのはなぜ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)
結果からすべての末尾の空白を削除しますが、ドットでドットを分割すると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
ます。
ドット「。」はJava正規表現エンジンの特殊文字であるため、「\\」を使用する必要があります。このキャラクターをエスケープするには:
final String extensionRemoved = filename.split("\\.")[0];
これは、.
が正規表現の予約文字であり、任意の文字を表すためです。代わりに、次のステートメントを使用する必要があります。
String extensionRemoved = filename.split("\\.")[0];
私はあなたが点を逃れるべきだと信じています。試す:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
それ以外の場合、ドットは正規表現の任意の文字として解釈されます。