Начинающему программисту нужен совет: «Строковый индекс вне диапазона» - Java - PullRequest
1 голос
/ 07 октября 2011

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

Вот что у меня есть:

    import java.io.*;
    import java.util.Scanner;

    public class ReadNamesFile
    {
        public static void main(String[] args) throws IOException {
        // make the names.csv comma-separated-values file available for reading
        FileReader f = new FileReader("names.csv");
        BufferedReader r = new BufferedReader(f);
        //
        String lastName="unknown", firstName="unknown", office="unknown";

        // get first line
        String line = r.readLine();

        // process lines until end-of-file occurs
        while ( line != null )
        {
           // get the last name on the line
           //
           // position of first comma
           int positionOfComma = line.indexOf(","); 
           // extract the last name as a substring
           lastName = line.substring(0,positionOfComma); 
           // truncate the line removing the name and comma
           line = line.substring(positionOfComma+1); 

           // extract the first name as a substring
           firstName = line.substring(0,positionOfComma); 
           // truncate the line removing the name and comma
           line = line.substring(positionOfComma+1);

           // extract the office number as a substring
           office = line.substring(0,positionOfComma);
           // truncate the line removing the name and comma
           line = line.substring(positionOfComma+2);
           //
           //        
           //
           // display the information about each person
           System.out.print("\nlast name = "+lastName);
           System.out.print("\t first name = "+firstName);
           System.out.print("\t office = "+office);
           System.out.println();
           //
           // get the next line
           line = r.readLine();
        }
    }
}

По сути, он находит фамилию, имя и номер офиса в файле .csv и распечатывает их.

Когда я компилирую, я не получаю никаких ошибок, но при запуске я получаю:

java.lang.StringIndexOutOfBoundsException: String index out of range: 7
at java.lang.String.substring(String.java:1955)
at ReadNamesFile.main(ReadNamesFile.java:34)

Прежде чем пытаться выполнить часть номера офиса, первые два (фамилия и имя) напечатаны нормально, но номер офиса, кажется, не работает.

Есть идеи?

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

Ответы [ 5 ]

1 голос
/ 07 октября 2011

Давайте поработаем на примере, какие у вас проблемы с вашим кодом.

Например: строка: переполнение, стек
{length: 14}

Принимаяоператоры вашей программы построчно -

int positionOfComma = line.indexOf(",");  // returns 9

lastName = line.substring(0,positionOfComma); // should be actually postionOfComma-1

Теперь lastName имеет Overflow.positionOfComma имеет 9.

line = line.substring(positionOfComma+1);

Теперь line имеет stack.

firstName = line.substring(0,positionOfComma); 

Запрашивая подстроку от 0 до 9 .Но stack имеет только длину 5 .Это приведет к тому, что Строковый индекс выйдет за пределы диапазона .Надеюсь, вы поняли, где вы делаете неправильно.

0 голосов
/ 07 октября 2011
int positionOfComma = line.indexOf(",");

эта строка кода может не найти запятую, и тогда positionOfComma будет -1.Затем вы подставляете что-то с помощью (0, -1) - не удивительно, что это дает исключение StringIndexOutOfBoundsException.Используйте что-то вроде:

int positionOfComma = 0;
if(line.indexOf(",")!=-1)
{
   positionOfComma = line.indexOf(",");
}

Вам иногда приходится много проверять, особенно когда данные повреждены: (

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#indexOf(java.lang.String)

PS I 'Я уверен, что кто-то умный может сделать мою кодировку потрепанной, но вы поняли, я надеюсь:)

0 голосов
/ 07 октября 2011

Вам необходимо:

a) Убедитесь, что вы обрабатываете регистр, если не можете найти запятую (т.е. если вы не можете найти и извлечь строку lastName и / или firstName)

b) Убедитесь, что значение «positionOfComma + N» никогда не превышает длину строки.

Несколько блоков «if» и / или операторов «continue» отлично справятся; -)

0 голосов
/ 07 октября 2011

Вы правильно нашли positionOfComma, но тогда эта логика применяется к исходному значению line.Когда вы удаляете фамилию и запятую, positionOfComma больше не является правильным, поскольку оно применяется к старому значению строки.

0 голосов
/ 07 октября 2011

С JavaDoc :

(StringIndexOutOfBoundsException) - Методы, создаваемые функцией String, указывают, что индекс либо отрицателен, либо превышает размер строки.

В вашем случае один из ваших вызовов .substring получает значение, равное >= длине строки.Если строка # 34 является комментарием, то это строка выше # 34.

...