Ошибка в одной строке. Что я сделал не так?

Вот мой код:

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)

Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? Какая незначительная ошибка?


ОБНОВИТЬ

Строка передаваемой строки - "Тебе *победитель* всех!"

Редактируется *victor* на VICTOR и помещается обратно в строку sLine.

Я пытаюсь взять из назначенного сканера из основного метода, а затем беру то, что получаю, из сканера и верхней части корпуса специально назначенный выбор между двумя звездочками.


person justCause7682mrv    schedule 05.02.2016    source источник
comment
Что вы пытаетесь сделать с помощью цикла while? Возможно, мы сможем помочь вам изменить структуру вашего кода, чтобы упростить эту строку.   -  person Noam Hacker    schedule 05.02.2016
comment
Вы пытаетесь получить доступ к области за пределами строки. Покажите нам значение sLine, для которого это происходит.   -  person Tim Biegeleisen    schedule 05.02.2016
comment
обновил мой оригинальный пост.   -  person justCause7682mrv    schedule 05.02.2016


Ответы (5)


Если строка начинается с *, F1 будет 0. Таким образом, F1-1 здесь будет проблемой:

Line = sLine.substring(0,F1-1)
person Sami Sallinen    schedule 05.02.2016
comment
Пытаюсь взять *victor* и заставить сказать VICTOR без звездочек. - person justCause7682mrv; 05.02.2016
comment
Выведите sLine, F1 и L1 в цикле и посмотрите, что получится. - person Sami Sallinen; 05.02.2016

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это будет работать, ТОЛЬКО если у вас есть две звездочки в строке. (Но это должно дать вам представление.)

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!
person jmcg    schedule 05.02.2016

Попробуй это:

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);
        }
    }
person Divya    schedule 05.02.2016

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

Это может быть из-за вашего цикла while, когда ввод "To you the * victor * of all!", он работает нормально.

person smttsp    schedule 05.02.2016

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

person Mario Garcia    schedule 05.02.2016