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

搜索文件中的单词会导致java.util.NoSuchElementException,java,arrays,file-io,Java,Arrays,File Io,这是我的密码。它产生错误java.util.NoTouchElementException。 这意味着在一个作业窗格中搜索一个单词(如和),并找到该单词的所有实例,同时在其两侧打印该单词(如奶酪和火腿,汤姆和杰瑞)。代码: import java.io.File; import java.util.Arrays; import java.util.Scanner; import javax.swing.JOptionPane; public class openFileSearchWord

这是我的密码。它产生错误
java.util.NoTouchElementException
。 这意味着在一个
作业窗格中搜索一个单词(如
),并找到该单词的所有实例,同时在其两侧打印该单词(如
奶酪和火腿
汤姆和杰瑞
)。代码:

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);
        }
    }
}
导入java.io.File;
导入java.util.array;
导入java.util.Scanner;
导入javax.swing.JOptionPane;
公共类openFileSearchWord{
公共静态void main(字符串参数[])
{
int i=0,j=0;
String searchWord=JOptionPane.showInputDialog(“您要搜索什么单词?”);
File File=新文件(“example.txt”);
尝试
{
Scanner fileScanner=新扫描仪(文件);
String[]数组=新字符串[5];
字符串[]输入=新字符串[1000];
while(fileScanner.hasNextLine())
{

对于(i=0;i,看起来你假设每行有1000个单词

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

对于(i=0;i我在这里看到一些错误

您正在创建两个阵列,一个包含5个元素,另一个包含1000个元素。 在您的代码中,您直接通过索引引用元素……但是这个索引可能不存在

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

array[j] ... what if j > 4 ... index 5 doesn't exist
我建议使用元素列表而不是固定数组

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

您假设输入是某种东西,但不做任何事情来检查它实际是什么。

正如Drejc告诉您的那样,第一次迭代将因负索引而失败,如果程序找到所需单词的5个以上匹配项,则程序也将失败

此外,我还想添加另一个。您应该认为,当您执行这一行时:

array[j] = input[i-1] + input[i] + input[i+1];
您尚未分配输入[i+1]。在该迭代中,您只分配了输入[i],但没有分配下一个输入

当到达nextWord时,您应该处理三个元素(previousWord+match+nextWord)的连接


另一种解决方案虽然效率不高,但会在开始时将所有单词复制到一个数组中,并在不修改的情况下使用实际代码。这会起作用,但会对所有单词进行两次检查。

发布堆栈跟踪,并提供错误指示的行?但下一步()不使用下一行?我想您可以通过任意多个
nextLine()
运行上述代码,或者更改分隔符。
List<String> array = new ArrayList<>();
array[j] = input[i-1] + input[i] + input[i+1];