2011-10-05 77 views
11

如果我做
爲什麼在java中分割函數的行爲如此?

String a = "" 
    String b = a.split(" ")[0]; 

它是不是給ArrayIndexOutOfBoundException

但是當我做

String a = " " 
    String b = a.split(" ")[0]; 

這是給我再ArrayIndexOutOfBoundException

當我做

String a = " abc" 
    String b = a.split(" ")[0]; 

它不是給我例外 爲什麼呢?

+7

有點出乎意料: 「這種方法的工作原理,如果通過與給定表達式和爲零的限制參數調用兩個參數的分割方法尾隨因此空字符串中不包括所得到的陣列中的」 http://download.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String%29 –

+0

@MariusSolbakkenMellum:你完全正確,發表你的評論作爲答案! – maerics

+0

@Marius - 你爲什麼不把它當作答案? –

回答

2

後:

String a = " " 
String[] arr = a.split(" "); 

arr爲空數組。這就是爲什麼當你試圖訪問它的第一個(也是不存在的)元素時它會拋出一個ArrayIndexOutOfBoundsException。現在,經過:

String a = " abc" 
String[] arr = a.split(" "); 

arr有一個元素:​​,這就是爲什麼當您嘗試訪問它的第一個元素不會拋出異常。

0

它總是一種可能性,即如果所提供的regex

3

完全吻合這是一種奇怪的String.split()會返回一個空數組。

事情是,在你的第一個例子中,空字符串「」是一個字符串,而不是空。所以當你說:用標記「」拆分這個「」,模式不匹配,你得到的數組是原始的字符串。和你一樣

String a = "abc"; 
String b = a.split(" ")[0]; 

要拆分的模式不匹配,所以你得到一個令牌,原始的String。

由於String的COMPLETE內容正好是您傳遞給split的分隔符,所以您最終得到一個空數組。

讓我知道你是否想要一些進一步的細節,但這是非常多的。

2

情況#1

String a = "" 
String b = a.split(" ")[0]; 

Javadoc

如果表達式不匹配輸入的任何部分,則 所得陣列僅具有一個元素,即這串。

所以split()給你一個單元素數組,由輸入的字符串("")的。因此沒有例外。

情況#2

String a = " " 
String b = a.split(" ")[0]; 

Javadoc:因此

尾隨空字符串中不包括所得到的 陣列英寸

你有兩個這樣的尾隨空字符串,沒有別的。因此你得到一個零大小的數組,導致異常。

案例#3

String a = " abc" 
String b = a.split(" ")[0]; 

這不是太大的極端情況,因爲它顯然有返回至少一個元素,因此也不例外。

1

String a =「」;

String b = a.split(「」)[0];

當您這樣做時,由於不存在'split'字符,因此不執行拆分操作,並且數組以第一個和唯一元素作爲空字符串返回。

String a =「」;

String b = a.split(「」)[0];

雖然在這種情況下它會嘗試拆分字符串,但不會將值放在任何一邊,因此不會創建數組。因此當您嘗試訪問其第0個元素時,它會給出ArrayOutOfBoundException。

String a =「abc」;

String b = a.split(「」)[0];

在這種情況下,分裂發生和「ABC」被放置在第0位置(I猜)和如果只剩下一個陣列的尺寸大於0 問題解決了!! ..

相關問題