java使用split遇到的坑


使用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拆分字符串時,想獲取字符串數組對應下標的數據,必須先判斷數組長度。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM