2014-01-07 5 views
0

Код ниже дает мне головную боль: он должен выпрыгнуть из цикла do-while после замены всех \ n, но это не так. Есть идеи, как это решить?java: code keep looping

public String invoerenTemplate(){ 
     String templateGescheiden = null; 
     String teHerkennenTemplate = Input.readLine(); 
     String uitvoer = teHerkennenTemplate; 

     do {    
      templateGescheiden = teHerkennenTemplate.substring(0, teHerkennenTemplate.indexOf(" ")); 

      templateGescheiden += " "; 

      if (templateGescheiden.charAt(0) == '\\' && templateGescheiden.charAt(1) == 'n') { 
       teHerkennenTemplate = teHerkennenTemplate.replace(templateGescheiden, "\n"); 
       uitvoer = uitvoer.replace(templateGescheiden, "\n"); 
      } 
      teHerkennenTemplate = teHerkennenTemplate.substring(teHerkennenTemplate.indexOf(" ")); 

      System.out.println(uitvoer); 
      } while (teHerkennenTemplate.length() > 0); 
      return uitvoer; 

    } 

EDIT:

теперь я поместил эту строку: teHerkennenTemplate.trim(); чуть ниже моего, если-заявление, но теперь она дает мне ошибку StringIndexOutOfRange: 0 в моей первой строке из моих Условный оператор

+4

Какое условие прекращения действия? Будет ли он когда-либо оценивать «ложь»? –

+0

Я подставляю «teHerkennenTemplate» в пространствах, поэтому в конце концов должно быть пустым – user3165926

+0

Возможно ли, что teHerkennenTemplate застрял на строке с «» (пробел), поэтому строка teHerkennenTemplate = teHerkennenTemplate.substring (teHerkennenTemplate.indexOf (" «)); всегда имеют такой же эффект? попытайтесь добавить печать на teHerkennenTemplate после строки выше для отладки. – Wasafa1

ответ

0

У меня есть заметил пару проблем с вышеуказанным кодом, хотя трудно сказать, почему вы принимаете подход, который вы решаете.

Главное, что я заметил, что ваши заменяющие заявления НЕ удаляйте \n символы

teHerkennenTemplate = teHerkennenTemplate.replace(templateGescheiden, "\n"); 
uitvoer = uitvoer.replace(templateGescheiden, "\n"); 

От Java Документация:

заменить (символ oldChar, символ newChar):

Возвращает новую строку, полученную в результате замены всех вхождений oldChar в этой строке на n ewChar.


Итак, вы заменяете вашу строку templateGescheiden с \n каждый раз, когда вам цикл.

Другой проблемой было бы неправильное сокращение вашей строки teHerkennenTemplate каждой петли, что приводит к ее неправильному завершению. Он всегда будет сокращаться от следующего символа пробела до конца строки (включительно), то есть он никогда не будет пустой строкой, но всегда будет иметь значение " ".

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

0

Там есть множество вещей неправильно с кодом:

  • индекс возврата каретки находится в строке с indexOf("\n").
  • Подстрока teHerkennenTemplate не принимает во внимание, что она начинается с пробела, из-за чего цикл продолжается навсегда.

Самый простой способ сделать то, что вы хотите с регулярным выражением:

"test \n test \n".replaceAll("\n", "") 

Вернет:

"test test " 

Если вы установите на использовании цикла, то это будет делать То же самое:

public static String invoerenTemplate(String teHerkennenTemplate) 
{ 
    StringBuilder result = new StringBuilder(); 

    while (teHerkennenTemplate.length() > 0) 
    { 
    int index = teHerkennenTemplate.indexOf("\n"); 
    result.append(index > -1 ? teHerkennenTemplate.substring(0, index) : teHerkennenTemplate); 

    teHerkennenTemplate = teHerkennenTemplate.substring(index + 1, teHerkennenTemplate.length()); 
    } 

    return result.toString(); 
}