Исключение программирования Java - PullRequest
0 голосов
/ 06 марта 2011

Кто-нибудь может мне помочь?Я не понимаю это исключение:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 9
    at java.lang.String.charAt(Unknown Source)
    at charPerLine.main(charPerLine.java:13)

Вот ответственный код:

import java.util.*;
public class charPerLine {

    public static void main(String[] args)throws StringIndexOutOfBoundsException {
        Scanner sc=new Scanner(System.in);
        System.out.print("Type any name:");
        String s=sc.next();
        int j= s.length()+1;
        for(int i=0;i<=j;i++){
            System.out.println(s.charAt(i));
        }
    }
}

Ответы [ 7 ]

10 голосов
/ 06 марта 2011

Вы пытаетесь получить прямой доступ к 10-му символу строки, которая содержит менее 10 символов. Что-то вроде:

"12345".charAt(9)

Помните, что строковые индексы основаны на 0, следовательно .charAt(9) => 10-й символ. Так что "123".charAt(3) тоже бросил бы.

3 голосов
/ 06 марта 2011

Ах. Спасибо Грегу за то, что он нашел ссылку на другую половину этого вопроса. Он прав, это нечестно.

Ваш цикл for изменяется от 0 до любой длины s плюс один.

Так что, если s был массив:

['a','b','c']

Тогда это будет значение от 0 до 4. Индексами этого массива являются 0, 1 и 2. Таким образом, вы пытаетесь получить доступ к двум точкам за концом.

Вы хотите удалить эту строку:

int j= s.length()+1;

И изменить цикл for на:

for(int i = 0; i < s.length(); i++){
3 голосов
/ 06 марта 2011

Вы ссылаетесь на символ в позиции 9, которая находится вне диапазона фактической строки.Не забудьте проверить, что он находится в диапазоне [0, длина [.

2 голосов
/ 06 марта 2011

j равно s.length()+1, а затем i равно <=j.Итак: s.charAt(i) в конечном итоге получит доступ к индексу length()+1, что на 2 больше, чем ему разрешено.

1 голос
/ 06 марта 2011

Выражение

s.charAt(i)

выдаст ошибку, если i больше или равно s.length().Попробуйте использовать

for (int i=0; i<s.length(); i++)
    // ...

.

1 голос
/ 06 марта 2011

Цикл должен быть:

for(int i=0; i < s.length(); i++){
  System.out.println(s.charAt(i));
}

Последний символ в строке имеет индекс:

s.length() - 1

, поэтому вам нужно использовать охрану:

i < s.length()

Таким образом, ваш цикл завершается до того, как i становится s.length().

0 голосов
/ 30 января 2013

просто замените

int j= s.length()+1;
for(int i=0;i<=j;i++){
 ...
}

на

int j= s.length();
for(int i=0;i<j;i++){
 ...
}

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...