带有迭代器的无限while循环,hasNext()和next()

时间:2015-04-18 12:31:03

标签: java iterator apache-poi infinite-loop next

我正在开发一个Java项目,它使用Apache POI来操作.docx文件。两天前我遇到了一个问题,我无法解决。我真的不知道,我的错误在哪里,是什么原因造成的。我唯一知道的是,这个bug正在做什么。

两天前,一切正常。我选择了我的.docx,点击了单选按钮,它们定义了将要执行的更改,然后我点击了我的“提交”按钮开始这项工作。 它的工作方式如下:使用Apache POI方法从.docx获取所有文本,遍历每个Run,更改关键字和语法,并将更新后的Paragraph及其运行放回到文档中。从第二个单选按钮开始重复该过程。最后,带有两个单选按钮的更改的文档将在其文件名中以后缀保存。 如果我现在选择一个特殊的单选按钮,则操作在整个文档中成功运行。但是,在第二次运行(由第二个单选按钮定义)的操作期间,看起来执行在特定点冻结,因为Eclipse控制台没有显示任何更改。实际上,如果我终止应用程序,并查看生成的文档,我将看到,同一段文本一遍又一遍地粘贴到文档中。该文件长约11页。这种错误的粘贴在几秒钟内将其大小增加了330多页。这让我想到,必须有一个无限循环。其他任何事情对我都没有多大意义。

奇怪的是,我从未改变过该算法的任何内容(我认为)。我做的最后一件事就是将我的Java版本更新到8u45,但是由于我回滚到我以前的版本,并且错误仍然存​​在,我看起来并不像更新导致错误。

我希望你们其中一个人对我有一些建议。我不认为,在这里发布我的代码是有用的,因为它几乎是其他方法的完整副本,它可以正常工作,但无论如何我都会这样做。代码的和平是唯一的部分(在选择错误的单选按钮之后),我使用while循环。所有其他循环都是for循环。令我困惑的是:

  • 第一个radion buttong(越野车)做什么,以便执行以下更改以无限循环结束?
  • 如果是infinate循环,它在我的文档中如何写?如你所见,当我离开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();
        }
    }
    

有没有人经历过类似的事情?我很乐意为你解决这个问题。

更新:通过选择提到的单选按钮调用的错误代码不会影响由其他单选按钮调用的方法。它看起来像这样。事实上,代码的错误代码将如此庞大的文本写入我的变量,此时我认为输出流仍然忙于将大量文本写入我的文档,而以下方法正在尝试访问该文档。到目前为止,这回答了上面列表的第一个问题。另一个问题和问题仍然存在。

1 个答案:

答案 0 :(得分:1)

前几天我找到了解决方法。

没有无限循环,即使它看起来像这样,因为同一段文字被粘贴了数千次到我的文档中。

经过一段绝望的时间,试图找出,为什么我的循环不能正常工作,我决定吞下苦药,并逐步找出造成错误的原因。

因此,我将大部分代码放入注释中,并逐步取消注释每一段代码。我发现,循环已正确实现,并且错误隐藏在方法中,这有助于替换文档中的某些文本。

我有这样的事情:

String checkString = "";

作为我的变量的简单初始值。

在某些特殊情况下&#34; checkString&#34;会得到一个String,在其他一些情况下,它应该保留为空字符串。

错误在于处理第二种情况。我有一个if子句,其定义如下:

if(baseString.contains(checkString))

你看到这里,如果&#34; checkString&#34;会发生什么?是一个空字符串? 是的,当然,&#34; baseString&#34;在任何情况下都包含&#34;&#34; if-clause每次都是真的。这个if子句中的其他行做了一些工作,这导致看起来像文本的无限粘贴。

if(checkString != "" && baseString.contains(checkString))

修复了一切。

错误表现出来的方式让我想到,这个bug到处都是,但不是那个方法。这些简单的错误让我如此疯狂,这很有趣。