在文件中搜索单词会导致java.util.NoSuchElementException

时间:2014-10-23 17:05:32

标签: java arrays file-io

这是我的代码。它产生错误java.util.NoSuchElementException。 它旨在搜索文件example.txt以获取单词(例如and)并找到该单词的所有实例并在其两侧打印单词(例如cheese and hamtom and jerry)在一个JOptionPane中。代码:

import java.io.File;
import java.util.Arrays;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class openFileSearchWord {

    public static void main(String Args[])
    {

        int i=0,j=0;
        String searchWord = JOptionPane.showInputDialog("What Word Do You Want To Search For?");
        File file = new File("example.txt");

        try
        {
            Scanner fileScanner = new Scanner(file);    
            String[] array = new String[5];
            String[] input = new String[1000];
            while (fileScanner.hasNextLine())
            {
                for(i=0;i<1000;i++)
                {
                    input[i] = fileScanner.next();
                    if(input[i].equalsIgnoreCase(searchWord))
                    {
                        array[j] = input[i-1] + input[i] + input[i+1];
                        j++;
                    }
                }
            }
            Arrays.toString(array);
            JOptionPane.showMessageDialog(null, array);

            fileScanner.close();
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

看起来你假设每一行都有1000个单词。

  while (fileScanner.hasNextLine())
  {
      for(i=0;i<1000;i++) <-------- Hardcoded limit?
      {
          ....
      }
  }

您可以尝试添加另一个catch循环,或者在for循环期间检查hasNext()。

while (fileScanner.hasNextLine())
{
    for(i=0;i<1000 && fileScanner.hasNext();i++)
    {
        ....
    }
}

您的代码也存在许多问题,例如输入[i-1]命中-1索引,或者'数组'数组是否达到限制。

我冒昧地享受了一些乐趣。

Scanner fileScanner = new Scanner(file);    
List<String> array = new ArrayList<String>();

String previous, current, next;

while (fileScanner.hasNext())
{
    next = fileScanner.next());  // Get the next word
    if(current.equalsIgnoreCase(searchWord))
    {
        array.add( previous + current + next );
    }

    // Shift stuff
    previous = current;
    current = next;
    next = "";
}

fileScanner.close();

// Edge case check - if the last word was the keyword
if(current.equalsIgnoreCase(searchWord))
{
    array.add( previous + current );
}

// Do whatever with array
....

答案 1 :(得分:1)

我在这里看到一些错误......

您正在创建两个数组,一个包含5个,另一个包含1000个元素。 在您的代码中,您直接通过索引引用元素...但此索引可能不存在。

input[i-1] ... what if i = 0? ...index is -1 

array[j] ... what if j > 4 ... index 5 doesn't exist

我建议使用List of elements而不是固定数组。

List<String> array = new ArrayList<>();

您假设输入是一些东西,但没有做任何事情来检查它实际上是什么。

答案 2 :(得分:0)

就像Drejc告诉你的那样,第一次迭代会因为负面索引而失败,如果找到超过5个匹配的所需单词,程序也会失败。

我还要添加另一个。你应该认为当你这样做时:

array[j] = input[i-1] + input[i] + input[i+1];

您还没有分配输入[i + 1]。在那次迭代中,你刚刚分配了输入[i],但没有分配下一个。

到达nextWord时,您应该处理三个​​元素(previousWord + match + nextWord)的串联。

另一种解决方案,但效率低下,将在开始时将所有单词复制到数组,并使用您的实际代码而不进行修改。这样可行,但你会在所有的单词中使用两次。