2015-02-08 74 views
-2

对不起,我的英语。按字符读取文件,您需要找到文件中的单词。一切似乎都很好,但出现错误java.lang.StringIndexOutOfBoundsException最有可能发生在这里int endWord = wordToFind.length();但是这个错误显示了IU需要的。如果我wordToFind.length() - 1,错误消失。但是,然后输出不是我所需要的。字符串错误。 java.lang.StringIndexOutOfBoundsException(java)

private static String wordToFind = "one"; //word what i need find 

public static void main(String[] args) throws FileNotFoundException, IOException{ 
    int endWord = wordToFind.length(); //size word, maby this error 
    int startWord = 0; 
    String myWord = ""; // this value create word 

    char[] barray = new char[1024]; //byte array 

    try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("t.txt")))){ //read t.txt 

     int value; 
     while((value = reader.read(barray, 0, barray.length)) != -1) { 

      for(int i = 0; i < value; i++){ 
       //check character 
       if(wordToFind.charAt(startWord) == barray[i]){ 
        startWord++; 

        if(startWord > endWord){ 
         startWord = 0; 
         myWord = ""; 
        }else{ 
         myWord += barray[i]; 
        } 

        if(startWord == endWord){ 
         System.out.println(myWord); 
        } 
       } 
      } 
     } 
    }catch(Exception e){ 
     System.out.println("Error : "+e); 
    } 
} 

错误:java.lang.StringIndexOutOfBoundsException:字符串索引超出 范围:3

+1

“最可能” 不够好。请确定地告诉我们它发生的位置**另外,请发布您的“t.txt”文件的内容。 – 2015-02-08 13:42:37

回答

1

字符串有(由后面的)一个字符数组,它将在内部保存“one”的值为value[] = {'o', 'n', 'e'}

数组索引从0开始并且前往,直到N-1,这样你就可以查询从0到2的值现在,在你的代码中有:

for(int i = 0; i < value; i++) { 
if(wordToFind.charAt(startWord) == barray[i]){ 
    startWord++; 
    if(startWord > endWord) { 

现在让我们说你从0循环迭代至5,你会尝试:

i =0//iteration 1 
if(wordToFind.charAt(0) == barray[i]){ 
    startWord++;// is now 1 
    if(startWord > endWord) {//1>3 no 

i =1//iteration 2 
if(wordToFind.charAt(1) == barray[i]){ 
    startWord++;// is now 2 
    if(startWord > endWord) {//2>3 no 

i =2 //iteration 3 
if(wordToFind.charAt(2) == barray[i]){ 
    startWord++;// is now 3 
    if(startWord > endWord) {//3>3 no 

i =3 
if(wordToFind.charAt(3) == barray[i]){//see you are accessing charAt(3) 
    startWord++;// is now 4 
    if(startWord > endWord) {//4>3 yes 

现在对于i为3时,你正在试图从(字符串)正被字符串内使用(其不存在)的阵列,并因此可以访问第三元件得到例外。

所以,你应该从

if(startWord > endWord) { 

要更改您的条件:

if(startWord >= endWord) { 
+0

非常感谢您的详细解释!如果我改变'if(startWord> = endWord)'那么没有输出 – qazqwerty 2015-02-08 15:28:35

+0

删除这些行if(startWord == endWord){System.out.println(myWord);如果(startWord = endWord){if(startWord == endWord){0} {0},则在现有的条件下添加这个if(startWord> endWord){System.out.println(myWord); } startWord = 0;' – SMA 2015-02-08 15:31:16

+0

它的工作!谢谢 – qazqwerty 2015-02-08 15:35:59

0

这些类型的错误,通过环路大多如此。它告诉你String太大,不适合你的数组。或者你正试图读取不存在的字符/字符串。

0

endWord就是一个字贵的长度,但charAt(int)是从零开始。这意味着您可以访问的最高指数是长度 - 1。所以,如果你是说

String str = "abcd"; 
char ch = str.charAt(str.length()); 

这将抛出一个异常,因为str.length()返回4,而指数范围从0到3

因此,在您的代码中,当您检查startWord > endWord时,应该是startWord >= endWord。如果检查成功,则startWord不能再用作索引,应该重置。就目前而言,代码将运行到startWord等于endWord,这意味着它作为索引使用太高,因此它将引发异常。

0

异常从

wordToFind.charAt(startWord) 

抛出因为startword等于wordToFind.length()。如果你看看docs of charAt,你会发现它会引起注意。

我也删除了try catch块,以便您可以看到发生异常的位置以及整个异常堆栈跟踪。

这条线将修复异常:

如果(startWord> = endWord){

我也修改逻辑来打印,我们已经找到了的话,那么,这将是按照我修改来修复异常。

这是你的代码固定:

private static String wordToFind = "mi6"; //word what i need find 

public static void main(String[] args) throws FileNotFoundException, IOException { 

    int endWord = wordToFind.length(); //size word, maby this error 
    int startWord = 0; 
    String myWord = ""; // this value create word 
    char[] barray = new char[1024]; //byte array 
    System.out.println("searching:"+wordToFind); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("/home/bpgergo/Workspace/mi6-REST_API/handover/README.md"))); //read t.txt 
    int value; 
    while((value = reader.read(barray, 0, barray.length)) != -1) { 

     for(int i = 0; i < value; i++) { 
      if(wordToFind.charAt(startWord) == barray[i]){ 
       startWord++; 
       myWord += barray[i]; 
       if(startWord >= endWord) { 

        System.out.println("Bingo:"+myWord); 
        startWord = 0; 
        myWord = ""; 
       } 
      } 
     } 
    } 
}