2013-11-27 63 views
-1

我想分解字符串192.168.1.2:6060;rport;branch=z9hG4bKNskFdtGO4"子串問題

我想在第一個分號之前提取port:ip,並在等號後面提取分支號。

我嘗試的代碼是

temp = in.next(); 
System.out.println(temp.contains(";")); 
System.out.println(temp.contains("=")); 
System.out.println("Temp: " + temp + " "); 
sipName = temp.substring(0, temp.charAt(';')); 
branch = temp.substring(temp.charAt('=')); 

我加入了printlns顯示,如果是至少在弦被人發現,他們的字符。

當我運行的代碼在我行獲得一個StringIndexOutOfBoundsError sipName = temp.substring(0, temp.charAt(';'));

我的控制檯輸出爲:

true 
true 
Temp: 192.168.1.2:6060;rport;branch=z9hG4bKb8NGxwdoR 
Exception in thread "Thread-1" java.lang.StringIndexOutOfBoundsException: String index out of range: 59 
... 

即使我只是嘗試System.out.println(temp.charAt(';'));

我不知道失敗的原因這發生了。有人能解釋嗎?我很難過。

回答

3

致電temp.indexOf(';')而不是temp.charAt(';')。同樣,請致電temp.indexOf('=')而不是temp.charAt('=')

indexOf告訴你第一次出現給定字符在字符串中的位置。 charAt返回字符代碼而不是字符串中的位置,所以在使用它的位置沒有意義。

(而且無論如何,當你調用charAt你在一個位置,把這個字符串中,而不是一個字符代碼,你幾乎可以把它作爲indexOf相反。)

+0

感謝您的快速回答,這是一段時間,因爲我不得不使用子字符串。感覺現在很傻。定時器冷卻後我會接受答案。 – redFIVE

1

將chat替換爲indexOf。

這個charAt是一個邏輯錯誤,你實際上想要indexOf。

OK,其他人更快;)

1
String sipName = StringUtils.substringBefore(str, ";"); 
String branch = StringUtils.substringAfter(str, "="); 

StringUtils docs

1

你需要的是

temp.indexOf(";"); 

你不會在編譯時得到任何異常,因爲它轉換「; 「轉換爲它的ASCII值59.所以它試圖訪問這個字符串的第60個元素。最後,這給你一個在運行時的

StringIndexOutOfBoundsException