2016-02-05 48 views
0

這裏是我的代碼:發生單行錯誤。我做錯了什麼?

while(n4.hasNext()){ 
      sLine = n4.next(); 
      if(sLine.contains("*")){ 
       F1 = sLine.indexOf("*"); 
       L1 = sLine.indexOf("*", F1+1); 
       upperC = sLine.substring(F1+1, L1-1); 
       upperC = upperC.toUpperCase(); 
//    sLine = sLine.substring(0,F1-1)+upperC+sLine.substring(L1+1, sLine.length() - 1); 
      } 

在那裏它與「SLINE的」啓動,因爲某些原因最後一行,我似乎無法得到它到達行的末尾沒有它說

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1 
    at java.lang.String.substring(Unknown Source) 
    at assign3.LoopPatterns.emphasize(LoopPatterns.java:138) 
    at assign3.LoopPatterns.main(LoopPatterns.java:291) 

有人能告訴我我做錯了什麼嗎?什麼是小錯誤?


UPDATE

傳遞的字符串的行是 「爲了大家的*勝利者*!」

正在編輯的內容是* victor *到VICTOR並放回字符串sLine中。

我試圖從主方法中指定的掃描儀中取出,然後從掃描儀和上殼中取出我在兩個星號之間特別指定的選項。

+0

你想用while循環做什麼?也許我們可以幫助您重構您的代碼以簡化該行 –

+0

您正試圖訪問字符串的超出範圍區域。向我們展示出現這種情況的'sLine'的價值。 –

+0

更新了我原來的帖子。 – justCause7682mrv

回答

0

如果該行以*開頭,F1將爲0 所以F1-1將是一個問題在這裏:

Line = sLine.substring(0,F1-1) 
+0

我試圖拿*勝利者*,並說它不帶星號的VICTOR。 – justCause7682mrv

+0

在循環中打印sLine,F1和L1,看看你得到了什麼。 –

0

免責聲明:如果你有你的字符串兩個星號,這隻會工作。 (但是,這應該給你一個想法。)

String givenString = "To you the * victor * of all!"; 

// + 1, because the beginning index is inclusive for of String#substring 
String betweenTheAsterisk = givenString.substring(givenString.indexOf("*") + 1 , givenString.lastIndexOf("*")).toUpperCase().trim(); 
System.out.println(betweenTheAsterisk); 

// this is a REGEX that basically captures everything between the asterisk, inclusive 
String finalString = givenString.replaceAll("\\*(.*?)\\*", betweenTheAsterisk); 
System.out.println(finalString); 

輸出:

VICTOR 
To you the VICTOR of all! 
0

試試這個:

while(scan.hasNext()){ 
     sLine = scan.nextLine(); 
     if(sLine.contains("*")){ 
      int F1 = sLine.indexOf("*"); 
      int L1 = sLine.indexOf("*", F1+1); 
      String lowerC = sLine.substring(F1+1, L1-1); 
      upperC = lowerC.toUpperCase().trim();     
      sLine = sLine.replaceAll("\\*\\s*"+lowerC +"\\s*\\*", upperC); 
     } 
    } 
0

如果你不知道如何調試,你可以找到問題很容易: 打印出F1L1的值並找出問題所在。

這可能是因爲你的while循環,當輸入是"To you the * victor * of all!",它工作正常。

0
Dim regex As Regex = New Regex("[\s|\p{P}]?\*[^\s](.*?)[^\s]\*[\s|\p{P}]?") 
    '[\s|\p{P}]?\*[^\s] = optional blank space or punctuation followed by '*', followed by anything but blank 
    '(.*?) = anything inside both '*' 
    '[^\s]\*[\s|\p{P}]? = anything but blank, followed by '*', followed by optional blank space or punctuation 
    ' something like this = " *This is a bold text*! This isn't." 

這是一個正則表達式我在VB在幾個月前提出,將檢測到任何出場**之間,但只有當他們是正確的前/後的文字。

 
*Hi there!* -> This is bolded out 

*Hi, my * is quite big*! ->The full sentence will be bolded here. (Ya, couldn't think of a better example) 

也許它有幫助,你可以使用它。 AFAIR,這工作的任何數字*的文字