2015-11-09 25 views
4

如果標題不清楚,我很抱歉。字符串類中的子字符串方法達到索引它不應該

現在,串指數從0開始。因此,例如:

Index 0 1 2 3 4 
String H E L L O 

在這種情況下,最後指數是4

如果我想嘗試做這樣的事情:

System.out.println("hello".charAt(5)); 

它會拋出'索引超出界限例外',因爲它應該。

但是,如果我嘗試運行下面的代碼:

System.out.println("hello".substring(5)); 

它跑了!我寫了類似的代碼,後來注意到了這一點,但無法弄清楚。

最終,問題是我們怎麼可能達到這個指數呢?它可以讓我們寫:

stringObj.substring(stringObj.length()); 

,它看起來不是很安全,因爲stringObj.length()返回我們一個整數,它比過去的指標是什麼人了。

是故意製造的嗎?這是否有目的?如果是這樣,這是什麼目的,它帶來的好處是什麼?

回答

6

更容易與substring工作的時候,你在想串索引這樣

  H E L L O 
     0 1 2 3 4 5 
     ^  ^
     |   | 
     start  length 
    (min index) (max index) 

當您從ab你只有這些指標之間的字符字符串。

所以在"HELLO".substring(2,4)情況下,你會得到

L L 
2 3 4 

返回"LL"

現在在substring(5)的情況下,它的作用與substring(5,length)相同,這意味着在這種情況下它是substring(5,5)。因此,由於5索引在我們的模型中存在它被認爲是正確的,並且因爲55之間沒有字符,所以我們得到空字符串作爲結果。

只要索引存在於我們的模型中,類似的情況發生在substring(0,0)substring(1,1)等情況下。

  • 消極因素:

    StringIndexOutOfBoundsException只有當我們試圖不屬於我們的模型訪問索引發生-1-2 ...

  • 或大於長度67更大,...
2

由於「索引越界異常中」這不會編譯,

它編譯。當您嘗試執行代碼時,您會得到一個運行時異常。

System.out.println("hello".substring(5)); 

最終,問題是,這怎麼可能,我們可以達到這個指標,我們不應該?

閱讀substring(...)方法的API。它解釋了該方法的工作原理以及參數的含義。

在這種情況下,它返回一個空字符串。

+0

我們不會在「hello」.substring(5)上得到異常,但API解釋我們得到「空」.substring(9)返回「」(一個空字符串)http://docs.oracle.com/ JavaSE的/ 7 /文檔/ API /爪哇/郎/字符串。html#substring(int) – bakki

+0

是的,我也檢查了文檔。但我不明白,它說beginIndex是包容性的。他們是如何實施這種方法的? – Haggra

+1

'它說beginIndex是包容性的 - 當然它是包容性的。你如何得到索引爲0的第一個字符?你會指定-1嗎?這沒有意義。將substring()方法與indexof()方法結合使用也很容易。您可以使用indexof()獲取索引,使用substring()獲取索引中的所有字符。 – camickr

1

在Java的String API (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int)

一個字符串 「長度()」 所指的子方法的方法將返回字符串中的字符數。

如果您從0-> 4計數「HELLO」,它仍然會達到5個字符(長度),這是您調用「Hello」.length()時返回的數字。如果你想訪問一個字符串的最後一個字符,使用(Stringobj.length() - 1);如果你想訪問字符串的最後一個字符,使用(Stringobj.length() - 1);通過使用.length()或.size()方法調用訪問字符串或數組的最後一個元素在Java中是標準化的。

0

在這種情況下,charAt和substring的實現細節有助於瞭解。

this tutorial描述可以被描述爲方法的charAt在於:

返回位於字符串的指定索引處的字符。字符串索引從零開始。

那就是爲什麼叫:

System.out.println("hello".charAt(5)); 

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: 
String index out of range: 5 

因爲最大的指數,因爲你完全描述的那樣,只有4

substring在Java中描述文檔並解釋您的具體情況here其中指出, 「實施例」 部分:

「空虛」 .substring(9)返回 「」(空字符串)

有關其他參考,這裏是java's substring(int index)的源代碼實現,你可以看到它使用java的substring(int beginInndex, int endIndex)方法。

相關問題