新手程序员需要建议:“字符串索引超出范围” - Java

时间:2011-10-07 03:03:13

标签: java string indexing range

我对编程很陌生,而且我遇到了一个错误,我确信这对于经验丰富的人来说很容易解决。

这就是我所拥有的:

    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 个答案:

答案 0 :(得分:1)

让我们举例来说,你的代码有什么问题。

  

例如:line:溢出,堆栈
  {长度: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);

现在linestack

firstName = line.substring(0,positionOfComma); 

0 询问子字符串到 9 。但stack只有 5 的长度。这将导致 String index超出范围异常。希望你明白你做错了什么。

答案 1 :(得分:0)

来自JavaDoc

  

(StringIndexOutOfBoundsException) - 由String方法抛出   指示索引是负数还是大于   字符串。

在您的情况下,您对.substring的一次调用的值为>=字符串的长度。如果第34行是评论,那么它就是#34以上的一行。

答案 2 :(得分:0)

你需要:

a)如果找不到逗号(例如,如果找不到并提取lastName和/或firstName字符串),请确保处理该案例。

b)确保“positionOfComma + N”的值永远不会超过字符串的长度。

一些“if”块和/或“continue”语句可以很好地完成这个操作; - )

答案 3 :(得分:0)

您正确找到positionOfComma,但该逻辑适用于line的原始值。当您删除姓氏和逗号时,positionOfComma不再正确,因为它适用于旧的行值。

答案 4 :(得分:0)

int positionOfComma = line.indexOf(",");

这行代码可能找不到逗号,然后positionOfComma将为-1。接下来你使用(0,-1)子字符串 - eeek难怪它给出了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我确信聪明的人会使我的编码看起来很破旧,但你明白我希望:)