冻结 while 循环

Frozen while loop

我对 while 循环有疑问。这是代码:

ExtendedIterator<Statement> statementIt = m.listStatements(null, p, obj);
Statement stamt = null;
List<Resource> lres = new ArrayList<Resource>();
System.out.println("\tdebugging: going into the while");
int counter = 0; 
while (statementIt.hasNext())
{
    System.out.println("\tdebugging: statementIt.hasNext()? " + statementIt.hasNext());
    System.out.println("\t\tdebugging: \t started round " + counter);
    stamt = (Statement)statementIt.next();
    if(!lres.contains((Resource)stamt.getSubject()))
        lres.add((Resource)stamt.getSubject());
    counter++;
    System.out.println("\t\tdebugging: counter is next at " + counter);
    System.out.println("\t\tdebugging: will be next? " + statementIt.hasNext());
    System.out.println("dadada dbdbdb");
}
System.out.println("\tdebugging: came out of the while alive!");

我知道只有 3 次迭代要完成,所以 var counter 加起来应该是 3 然后它就会退出循环,但是当计数器变成 3 并且是时候执行 hasNext() 程序冻结了。

我不知道我是在忽略一些重要的还是基本的东西,但我正在努力解决这个问题:(

编辑:

它应该执行循环 2 次,而不是 3 次。所以它与 hasNext() 执行有关,我会说。 这是我用来推断这个的 while 循环的 "new" 主体:

stamt = (Statement)statementIt.next();
if(!lres.contains((Resource)stamt.getSubject()))
    lres.add((Resource)stamt.getSubject());
counter++;
System.out.println("\t\tdebugging: this loop subject was " + ((Resource)stamt.getSubject()).toString());

它打印了 2 次并在尝试打印第 3 次时被冻结。

编辑2:

这是可以毫无问题地执行此操作的 C# 代码:

ExtendedIterator statementIt = m.listStatements(null, p, obj);
int quantity = 0;
Statement stamt = null;
List<Resource> lres = new List<Resource>();
while (statementIt.hasNext())
{
    stamt = (Statement)statementIt.next();
    quantity++;
    if(!lres.Contains((Resource)stamt.getSubject()))
        lres.Add((Resource)stamt.getSubject());
}

编辑3:

它绝对与迭代器有关(将 ExtendedIterator<Statement> 更改为 StmtIterator 以获得更好的性能,与手头的问题无关)。我将展示后续语句的打印:

[http://practicum/luis/ontologies/2015/8/document#BibRef2, http://practicum/luis/ontologies/2015/8/document#pointsAt, http://practicum/luis/ontologies/2015/8/document#Doc2]
[http://practicum/luis/ontologies/2015/8/document#BibRef1, http://practicum/luis/ontologies/2015/8/document#pointsAt, http://practicum/luis/ontologies/2015/8/document#Doc2]
[-75c480c5:151c9f1b5af:-7f54, http://practicum/luis/ontologies/2015/8/document#pointsAt, http://practicum/luis/ontologies/2015/8/document#Doc2]

最后打印的是不需要的。迭代器不应考虑该主题(十六进制的第一个元素),不应在列表中。那是一段记忆 space(我猜),与通过读取我的 .rdf 文件加载的 OntModel 无关 >:(

耶拿包的这些工具到底有什么问题????

好的,问题解决了。

上次编辑打印的注释space内存实际上是ontology的空白节点,所以应该打印。因为我只想考虑 URI 资源,所以我应该包括这种检查。

if(!stamt.getSubject().isURIResource())
    break;

干杯~

PS: 虽然原来的问题还没有解决(.hasNext() 冻结程序)我的具体问题已经解决了,我不再停滞不前了。我现在很惊讶我的 C# 程序没有出现此类问题。