使用split的時候,要多注意下標。
split方法
public String[] split(String regex) {
return split(regex, 0);
}
繼續往里看:
public String[] split(String regex, int limit) {
//....
return Pattern.compile(regex).split(this, limit);
}
split()方法內部,其實是用Pattern去處理的。
Pattern是一個正則表達式經編譯后的表現模式。
Pattern compile(String regex) 表示將給定的正則表達式編譯並賦予給Pattern類。
Patter還有matcher()、find()、group()等方法。
而split(String regex, int limit),通過設置limit指定拆分成幾部分。
如果只拆成兩部分,如下:
String [] parts = str.split(",", 2);
使用split
- split()的參數regex,是正則表達式。
比如,通過.去分隔:
String[] part=str.split("\\.");
通過,去分隔:
String[] part=str.split(",");
通過任意空格去分隔:
String[] part=str.split("\\s+");
數組下標越界
比如,以下方法,可能會出錯:
public void splitError(String str) {
if (str == null) {
return;
}
String[] part = str.split(",");
String s0 = part[0];
String s1 = part[1];
}
假如str的分隔符后面沒有數據,比如"a,",split拆分后的 String[]為{a}。
又或者str沒有分隔符,比如"abc",split拆分后的 String[]為{abc}
明顯part[1]會報錯:java.lang.ArrayIndexOutOfBoundsException: 1。
因此,修改代碼:
public void splitError(String str) {
if (str == null) {
return;
}
String[] part = str.split(",");
String s0 = part[0];
//添加以下判斷
if (part.length > 1) {
String s1 = part[1];
}
}
下標為0,也可能會越界
看似沒什么問題了,但是實際上還是可能出錯。
假如str為"," ,那么split拆分后的 String[]為{},數組為空,因此part[0]會報錯:java.lang.ArrayIndexOutOfBoundsException: 0。
修改代碼:
public void splitError(String str) {
if (StringUtils.isEmpty(str)) {
return;
}
String[] part = str.split(",");
if (part.length == 1) {
String s0 = part[0];
} else if (part.length > 1) {
String s0 = part[0];
String s1 = part[1];
}
}
拆分前,先檢查是否包含分隔字符
除了拆分之后,使用length判斷下標。也可以在拆分之前,先檢查是否包含分隔字符。
public void splitError(String str) {
if (StringUtils.isEmpty(str)) {
return;
}
if(str.contais(",")){
String[] part = str.split(",");
String s=part[0];
}
}
檢查最后一個分隔符后是否有內容
《阿里巴巴java開發手冊》上面有這樣一條:
【推薦】使用索引訪問用 String 的 split 方法得到的數組時,需做最后一個分隔符后有無
內容的檢查,否則會有拋 IndexOutOfBoundsException 的風險。
說明:
String str = "a,b,c,,";
String[] ary = str.split(",");
// 預期大於 3,結果是 3
System.out.println(ary.length);
結論
記住,在使用split拆分字符串時,想獲取字符串數組對應下標的數據,必須先判斷數組長度。
