2011-10-07 27 views
1

我很新的編程,我得到一個錯誤,我敢肯定,這是一個容易修復的更有經驗的人。新手程序員需要建議:「字符串索引超出範圍」 - Java

以下是我有:

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) 

之前要做的辦公室號碼部分,前兩個(姓和名)打印出來罰款但辦公室號碼似乎不起作用。

任何想法?

編輯:感謝所有職位的人,我仍然無法真正弄清楚。有人可以發佈一些真正愚蠢的東西嗎?我一直試圖解決這個問題一個小時,我無法得到它。

+1

這將有助於注意哪一行是第34行。 –

+2

建議:1)閱讀錯誤消息。喜歡錯誤信息。它從何而來?這是什麼意思? 2)使用調試器並停止異常;現在的價值是什麼讓它爆炸?他們爲什麼如此而不是「有效」的價值? – 2011-10-07 03:17:50

回答

0

JavaDoc

(的StringIndexOutOfBoundsException) - 由String方法來 拋出該異常指示索引或者爲負,或大於 字符串的大小越大。

在你的情況,一個你的電話到.substring被賦予的值是>=字符串的長度。如果第#34行是註釋,那麼它就是#34以上的行。

0

您需要:

一)確保您處理的情況下,如果你沒有找到一個逗號(也就是說,如果你不能找到並提取lastName和/或的firstName字符串)

B)確保「positionOfComma + N」的值永遠不會超過字符串的長度。

一對夫婦的「如果」塊和/或「繼續」語句就可以了很好;-)

0

您找到正確positionOfComma,但那麼邏輯適用於line原始值。當您刪除姓氏和逗號時,positionOfComma不再適用,因爲它適用於舊值的行。

1

讓我們以示例爲例,說明您的代碼存在哪些問題。

如:線:溢出,堆
{長度: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); 

詢問串從到。但是stack只有長度。這將導致字符串索引超出範圍exeception。希望你明白你在做錯什麼。

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

這行代碼可能無法找到一個逗號,然後positionOfComma將是-1。接下來你用(0,-1)對子串進行substring --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我相信聰明的人可以讓我編碼看起來破舊,但你得到的點,我希望:)

相關問題