2016-02-05 4 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 * и заставить его говорить VICTOR без звездочек. – justCause7682mrv

+0

Печать sLine, F1 и L1 в цикле и посмотреть, что вы получаете. –

0

ПРЕДУПРЕЖДЕНИЕ: Это будет работать только если у вас есть две звездочки на вашем String. (Но это должно дать вам идею.)

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

Если вы не знаете, как отлаживать, вы можете найти проблема легко: Распечатайте значения F1 и L1 и узнайте о проблеме.

Возможно, из-за вашего цикла 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." 

Это Regex я сделал в 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, это сработало для любого числа * в тексте

Смежные вопросы