带有迭代器 hasNext() 和 next() 的无限 while 循环
Infinite while loop with an iterator, hasNext() and next()
我正在开发一个 Java 项目,该项目使用 Apache POI 来操作 .docx 文件。两天前我遇到了一个问题,我无法解决。我真的不知道,我的错误在哪里,是什么原因造成的。我唯一知道的是,这个错误在做什么。
两天前,一切正常。我选择了我的 .docx,单击单选按钮,它定义了将执行的更改,然后单击 "submit" 按钮开始这项工作。
它是这样工作的:使用 Apache POI 方法从 .docx 中获取所有文本,遍历每个 运行,更改关键字和语法,并将更新后的段落及其 运行 放回文档。对于第二个单选按钮的更改重复该过程。最后,包含两个单选按钮的更改的文档被保存,并在其文件名中添加了后缀。
如果我现在选择一个特殊的单选按钮,那么整个文档的操作 运行 就会成功。但是,在操作第二个 运行(由第二个单选按钮定义)期间,执行似乎冻结在特定点,因为 Eclipse 控制台未显示任何更改。事实上,如果我终止应用程序并查看生成的文档,我会看到同一段文本被一遍又一遍地粘贴到文档中。该文件长约 11 页。这个有问题的粘贴在几秒钟内将其大小增加了 330 多页。这让我想到,一定有一个无限循环。其他任何东西对我来说都没有多大意义。
奇怪的是,我从未更改过该算法的任何内容(我认为)。我做的最后一件事是将我的 Java 版本更新为 8u45,但自从我回滚到我以前的版本后,错误仍然存在,我看起来不像是更新以某种方式导致了错误。
我希望你们中的一个能给我一些建议。我不认为,在这里发布我的代码是有用的,因为它几乎是其他方法的完整副本,这些方法工作正常,但无论如何我都会这样做。这种代码的和平是我使用 while 循环的唯一部分(在选择有问题的单选按钮之后)。所有其他循环都是 for 循环。让我困惑的是:
- 第一个 radion buttong(有问题的按钮)在做什么,以至于以下更改的执行以无限循环结束?
如果是无限循环,我的文档里是怎么写的?如您所见,当我离开 while 循环时,我只将内容写入文档。当我在 Eclipse 中手动终止它时,文档中应该没有任何文本。
public static void changeSingleMaleToMultiMale(String path, String title, XWPFDocument document) throws Exception
{
XWPFDocument oldDoc = document;
Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();
int length = title.length();
int counter = 0;
while(iterator.hasNext())
{
XWPFParagraph paragraph = iterator.next();
System.out.println("____ unchanged\n" + paragraph.getText() + "\n____\n\n");
List<XWPFRun> runs = paragraph.getRuns();
for(int i = 0; i < runs.size(); i++)
{
String text = runs.get(i).toString();
if(text.contains(title))
{
runs.get(i).setText(StringFunctions.fromSingleMaleToMultiMale(text, title, length), 0);
}
}
System.out.println("____ updated\n" + paragraph.getText() + "\n____\n\n");
document.setParagraph(paragraph, counter);
counter++;
}
try {
FileOutputStream output = new FileOutputStream(path.substring(0, path.length()-5) + "Aktualisiert.docx");
document.write(output);
output.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
有没有人经历过类似的事情?如果有任何小提示可以解决这个问题,我会很高兴。
更新:通过选择提到的单选按钮调用的错误代码不会影响其他单选按钮调用的方法。它看起来像这样。事实上,错误的代码和平将这么大的文本写入我的变量,此时我认为输出流仍在忙于将这么大的文本写入我的文档,而以下方法正在尝试访问该文档。到目前为止,这回答了上面列表中的第一个问题。另一个问题和问题仍然悬而未决。
几天前我找到了解决方案。
没有无限循环,即使它看起来像这样,因为同一条文本在我的文档中被粘贴了数千次。
经过一些绝望的时间,试图找出为什么我的循环不能正常工作,我决定吞下苦药并尝试逐步找出导致错误的原因。
所以我把大部分代码都放在注释里,然后一步一步取消注释每段代码。我发现,循环已正确实现,错误隐藏在方法中,这有助于替换文档中的一些文本。
我得到了这样的东西:
String checkString = "";
作为我的变量的简单初始值。
在某些特殊情况下 "checkString" 会得到一个字符串,在其他一些情况下它应该保留为空字符串。
错误是在处理第二种情况。我有一个 if 子句,它是这样定义的:
if(baseString.contains(checkString))
你看到这里了吗,如果 "checkString" 是一个空字符串会发生什么?
是的,无论如何,"baseString" 当然包含“”。
那个 if 子句每次都是真的。这个 if 子句中的其他行做了一些工作,这导致了看起来像无限粘贴的文本。
if(checkString != "" && baseString.contains(checkString))
修复了一切。
错误出现的方式让我想到,错误无处不在,但不是在那个方法中。有趣的是那些简单的错误让我如此生气。
我正在开发一个 Java 项目,该项目使用 Apache POI 来操作 .docx 文件。两天前我遇到了一个问题,我无法解决。我真的不知道,我的错误在哪里,是什么原因造成的。我唯一知道的是,这个错误在做什么。
两天前,一切正常。我选择了我的 .docx,单击单选按钮,它定义了将执行的更改,然后单击 "submit" 按钮开始这项工作。 它是这样工作的:使用 Apache POI 方法从 .docx 中获取所有文本,遍历每个 运行,更改关键字和语法,并将更新后的段落及其 运行 放回文档。对于第二个单选按钮的更改重复该过程。最后,包含两个单选按钮的更改的文档被保存,并在其文件名中添加了后缀。 如果我现在选择一个特殊的单选按钮,那么整个文档的操作 运行 就会成功。但是,在操作第二个 运行(由第二个单选按钮定义)期间,执行似乎冻结在特定点,因为 Eclipse 控制台未显示任何更改。事实上,如果我终止应用程序并查看生成的文档,我会看到同一段文本被一遍又一遍地粘贴到文档中。该文件长约 11 页。这个有问题的粘贴在几秒钟内将其大小增加了 330 多页。这让我想到,一定有一个无限循环。其他任何东西对我来说都没有多大意义。
奇怪的是,我从未更改过该算法的任何内容(我认为)。我做的最后一件事是将我的 Java 版本更新为 8u45,但自从我回滚到我以前的版本后,错误仍然存在,我看起来不像是更新以某种方式导致了错误。
我希望你们中的一个能给我一些建议。我不认为,在这里发布我的代码是有用的,因为它几乎是其他方法的完整副本,这些方法工作正常,但无论如何我都会这样做。这种代码的和平是我使用 while 循环的唯一部分(在选择有问题的单选按钮之后)。所有其他循环都是 for 循环。让我困惑的是:
- 第一个 radion buttong(有问题的按钮)在做什么,以至于以下更改的执行以无限循环结束?
如果是无限循环,我的文档里是怎么写的?如您所见,当我离开 while 循环时,我只将内容写入文档。当我在 Eclipse 中手动终止它时,文档中应该没有任何文本。
public static void changeSingleMaleToMultiMale(String path, String title, XWPFDocument document) throws Exception { XWPFDocument oldDoc = document; Iterator<XWPFParagraph> iterator = document.getParagraphsIterator(); int length = title.length(); int counter = 0; while(iterator.hasNext()) { XWPFParagraph paragraph = iterator.next(); System.out.println("____ unchanged\n" + paragraph.getText() + "\n____\n\n"); List<XWPFRun> runs = paragraph.getRuns(); for(int i = 0; i < runs.size(); i++) { String text = runs.get(i).toString(); if(text.contains(title)) { runs.get(i).setText(StringFunctions.fromSingleMaleToMultiMale(text, title, length), 0); } } System.out.println("____ updated\n" + paragraph.getText() + "\n____\n\n"); document.setParagraph(paragraph, counter); counter++; } try { FileOutputStream output = new FileOutputStream(path.substring(0, path.length()-5) + "Aktualisiert.docx"); document.write(output); output.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
有没有人经历过类似的事情?如果有任何小提示可以解决这个问题,我会很高兴。
更新:通过选择提到的单选按钮调用的错误代码不会影响其他单选按钮调用的方法。它看起来像这样。事实上,错误的代码和平将这么大的文本写入我的变量,此时我认为输出流仍在忙于将这么大的文本写入我的文档,而以下方法正在尝试访问该文档。到目前为止,这回答了上面列表中的第一个问题。另一个问题和问题仍然悬而未决。
几天前我找到了解决方案。
没有无限循环,即使它看起来像这样,因为同一条文本在我的文档中被粘贴了数千次。
经过一些绝望的时间,试图找出为什么我的循环不能正常工作,我决定吞下苦药并尝试逐步找出导致错误的原因。
所以我把大部分代码都放在注释里,然后一步一步取消注释每段代码。我发现,循环已正确实现,错误隐藏在方法中,这有助于替换文档中的一些文本。
我得到了这样的东西:
String checkString = "";
作为我的变量的简单初始值。
在某些特殊情况下 "checkString" 会得到一个字符串,在其他一些情况下它应该保留为空字符串。
错误是在处理第二种情况。我有一个 if 子句,它是这样定义的:
if(baseString.contains(checkString))
你看到这里了吗,如果 "checkString" 是一个空字符串会发生什么? 是的,无论如何,"baseString" 当然包含“”。 那个 if 子句每次都是真的。这个 if 子句中的其他行做了一些工作,这导致了看起来像无限粘贴的文本。
if(checkString != "" && baseString.contains(checkString))
修复了一切。
错误出现的方式让我想到,错误无处不在,但不是在那个方法中。有趣的是那些简单的错误让我如此生气。