搜索文件中的单词会导致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];