2017-02-07 2 views
-1

Я пишу программу, которая меняет порядок слов в предложении. (например, «красная шляпа принадлежит Джону» => «Джон принадлежит шляпе красного цвета»). Я прошел через цикл do-while, но я не понимаю, почему существует Индекс Исключение.StringIndexOutOfBoundsException: проблемы с String.substring() и String.indexOf()

Спасибо за вашу помощь,

JonBrown


Исключение:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -23 
    at java.lang.String.substring(Unknown Source) 
    at WordReverse.main(WordReverse.java:17) 

Код:

public class WordReverse 
    { 
     public static void main(String[] args) 
     { 
      String input = "The red had belongs to John"; 
      String reverse = ""; 
      int lastSpace = 0; 

      do 
      { 
      //Isolate Word w/ Preceding Space 
      int startIndex = lastSpace; 
      int endIndex = input.indexOf(' ', startIndex + 1); 

      //Add Word to front of String 
      reverse = input.substring(startIndex, endIndex) + reverse; 

      //Add Preceding Space for First Iteration 
      if (lastSpace == 0) reverse = " " + reverse; 

      //Reset Last Space 
      lastSpace = endIndex; 

      // Repeat Loop Until line14 .indexOf returns -1 due to lack of " ". 
      }while (lastSpace != -1); 

      System.out.println(reverse); 
     } 
    } 
+0

вопрос с input.indexOf (»», STARTINDEX + 1); возвращает -1 для последнего слова входной строки. – ravthiru

ответ

0

Как уже отмечалось, ваша проблема связана с lastIndex наличием -1. Это исправление прорывается из цикла, когда это произойдет, но не перед копированием оставшейся части строки в результате:

public class WordReverse 
{ 
    public static void main(String[] args) 
    { 
     String input = "The red hat belongs to John"; 
     String reverse = ""; 
     int lastSpace = 0; 

     do 
     { 
      //Isolate Word w/ Preceding Space 
      int startIndex = lastSpace; 
      int endIndex = input.indexOf(' ', startIndex+1); 
      if (endIndex==-1) { 
       reverse = input.substring(startIndex) + reverse; 
       break; 
      } 

      //Add Word to front of String 
      reverse = input.substring(startIndex, endIndex) + reverse; 

      //Add Preceding Space for First Iteration 
      if (lastSpace == 0) reverse = " " + reverse; 

      //Reset Last Space 
      lastSpace = endIndex; 

      // Repeat Loop Until line14 .indexOf returns -1 due to lack of " ". 
     }while (true); 

     System.out.println(reverse); 
    } 
} 
0

Просто используйте раскол для удобства

String input = "The red had belongs to John"; 

    String arr[] = input.split(" "); 

    for (int x = arr.length -1; x >= 0; x--) 
     System.out.println(arr[x]); 
0

Это решение является более элегантна:

public class WordReverse 
{ 
    public static void main(String[] args) 
    { 
     String input = "The red had belongs to John"; 
     String array = input.split(" "); 
     for(int i = array.length()-1; i >= 0; i++) 
      System.out.print(array[ i ] + " "); 
     System.out.println(); 
    } 
} 
+0

Wow input.split() является мощным, и я рад, что мне больше не придется делать это старомодно. –

0

Когда ты доходим до последнего пространства (ri ght до «John»), endIndex Значение равно -1. Затем вы пытаетесь позвонить subString() с endIndex меньше, чем startIndex, что вызывает сбой.

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