这是我的代码。它产生错误java.util.NoSuchElementException
。
它旨在搜索文件example.txt
以获取单词(例如and
)并找到该单词的所有实例并在其两侧打印单词(例如cheese and ham
,tom 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);
}
}
}
答案 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)的串联。
另一种解决方案,但效率低下,将在开始时将所有单词复制到数组,并使用您的实际代码而不进行修改。这样可行,但你会在所有的单词中使用两次。