Почему я получаю исключение java.lang.StringIndexOutOfBoundsException? - PullRequest
0 голосов
/ 19 сентября 2011

Я хочу написать программу, которая печатает слова постепенно, пока не появится полное предложение. Например: мне нужно написать (ввод) и вывод:

Я
Мне нужно
Мне нужно
Мне нужно написать.

Вот мой код:

public static void main(String[] args) {   
   String sentence = "I need to write.";
   int len = sentence.length();
   int numSpace=0;
   System.out.println(sentence);
   System.out.println(len);

   for(int k=0; k<len; k++){
      if(sentence.charAt(k)!='\t')
         continue;
      numSpace++;
   }

   System.out.println("Found "+numSpace +"\t in the string.");  

   int n=1;
   for (int m = 1; m <=3; m++) {      
      n=sentence.indexOf('\t',n-1);
      System.out.println("ligne"+m+sentence.substring(0, n));
   }
}

и вот что я получаю:

Мне нужно написать.
16
Найдено 0 в строке.
Исключение в потоке "main" java.lang.StringIndexOutOfBoundsException:
Индекс строки вне диапазона: -1 на
java.lang.String.substring (String.java:1937) в
split1.Split1.main (Split1.java:36) Java Результат: 1 СТРОИТЬ УСПЕШНО
(общее время: 0 секунд)

Я не понимаю, почему numSpace не учитывает вхождения пробелов и почему я не получаю правильный вывод (даже если я, например, заменяю numSpace на 3).

Ответы [ 7 ]

1 голос
/ 19 сентября 2011

Это похоже на домашнюю работу, поэтому мой ответ - подсказка.

Подсказка: прочитайте javadoc для String.indexOf, обращая внимание на то, что говорится о значении, возвращаемом, когда строка / символ не найдены.

(На самом деле - даже если это не формальное домашнее задание, вы явно новичок в Java. И новичкам нужно понять, что javadocs - первое место, которое нужно искать при использовании незнакомого метода.)

1 голос
/ 19 сентября 2011

Вы ошибаетесь понятием \t, которое является escape-последовательностью для горизонтальной табуляции , а не для пробела (пробела).Поиск ' ' поможет вам найти пробелы в вашем предложении.

1 голос
/ 19 сентября 2011

Ваш цикл ищет numSpace неверно.Вы ищете \t, который является символом табуляции, которого в строке нет ни одного.

Кроме того, когда вы зацикливаетесь в нижней части, вы получаете исключение, потому что вы пытаетесь разобрать этимтот же \t, который снова не даст результатов.Значение n в n=sentence.indexOf('\t',n-1); будет возвращать -1, что означает «нет последнего индекса того, что вы ищете».Затем вы пытаетесь получить фактическую подстроку со значением -1, которая является недопустимой подстрокой, поэтому вы получаете исключение.

1 голос
/ 19 сентября 2011
  1. У вас нет символа \t, поэтому indexOf(..) возвращает -1
  2. Вы пытаетесь подстроку от 0 до -1 - не удается

Решение заключается в проверке:

if (n > -1) {
    System.out.prinltn(...);
}
0 голосов
/ 25 сентября 2011

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

public static void main(String[] args) {   
  String sentence = "I need to write.";
  int len = sentence.length();

  String[] broken = sentence.split(" "); //Doing this instead of the counting of characters is just easier...

  /* 
   * The split method makes it where it populates the array based on either side of a " " 
   * (blank space) so at the array index of 0 would be 'I' at 1 would be "need", etc.
   */

  boolean done = false;
  int n = 0;

  while (!done)  { // While done is false do the below

    for (int i = 0; i <= n; i++) { //This prints out the below however many times the count of 'n' is.

    /*
     * The reason behind this is so that it will print just 'I' the first time when
     * 'n' is 0 (because it only prints once starting at 0, which is 'I') but when 'n' is 
     * 1 it goes through twice making it print 2 times ('I' then 'need") and so on and so 
     * forth.
     */
      System.out.print(broken[i] + " ");
    }
    System.out.println(); // Since the above method is a print this puts an '\n' (enter) moving the next prints on the next line

    n++; //Makes 'n' go up so that it is larger for the next go around

    if (n == broken.length) { //the '.length' portion says how many indexes there are in the array broken

    /* If you don't have this then the 'while' will go on forever. basically when 'n' hits
     * the same number as the amount of words in the array it stops printing.
     */
      done = true;
    }
  }
}
0 голосов
/ 19 сентября 2011
  1. \t представляет собой вкладку .Чтобы найти пробел , просто используйте ' '.
  2. .indexOf() возвращает -1, если не удается найти символ в строке.Поэтому мы продолжаем цикл до тех пор, пока .indexOf() не вернет -1.
  3. Использование continue здесь на самом деле не было необходимости.Мы увеличиваем numSpaces, когда встречаем пробел.
  4. System.out.format полезно, когда мы хотим смешать строки и переменные литерала.Не нужно безобразно + с.

String sentence = "I need to write.";
int len = sentence.length();
int numSpace = 0;   
for (int k = 0; k < len; k++) {
    if (sentence.charAt(k) == ' ') {
        numSpace++;
    }
}
System.out.format("Found %s in the string.\n", numSpace);
int index = sentence.indexOf(' ');
while(index > -1) { 
    System.out.println(sentence.substring(0, index));
    index = sentence.indexOf(' ', index + 1);
}
System.out.println(sentence);
}
0 голосов
/ 19 сентября 2011

Я думаю, что самый простой способ решить эту проблему - сначала разделить строку, используя функцию String.split. Примерно так:

static void sentence(String snt) {
    String[] split = snt.split(" ");

    for (int i = 0; i < split.length; i++) {
        for (int j = 0; j <= i; j++) {
            if (i == 1 && j == 0) System.out.print(split[j]);
            else System.out.printf(" %s", split[j]);
        }
    }
}

Как указали другие люди. Вы считаете все символы, кроме табуляции (\ t), как пробел. Вам нужно проверить пробелы по

if (sentence.charAt(k) == ' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...