困在一个循环中

时间:2011-07-25 12:55:26

标签: java while-loop

我有一个像这样的简单代码:

try {
    int i = 0;
    while (i < size) {
        System.out.println("i is" + i);
        if (someCondition) {
            System.out.println("do sth");
            someCondition = true;
            i++;
            System.out.println("i is" + i);
        } else {
            System.out.println("doAnotherThing");
            someCondition = true;
            i++;
            System.out.println("i is" + i);
        }
    }
} catch(Exception){

}

此代码段的输出为:

i is 0
do sth
i is 1
i is 0
doAnotherThing
i is 1

它应该增加I,而不是循环,但它没有。你对这个问题有什么看法吗?我从5个小时开始研究这个问题,也许我错过了什么。如果你能帮助我,我会很高兴的 提前致谢。

编辑:我想简化一些事情,但显然它不起作用:)好的这是真正的代码:

public void (Analyzer analyzer){
    try {    
        int i=0;
        while (i < analyzer.size()) {
            System.out.println("i is" + i);
            Object anInstance = analyzer.getObject().get(i);
            if (anInstance.getDatabaseCreated()) { //this comes from another class and is //false in the first place                         
                dropObject(analyzer.getId(),i); // removes object
                createAnInstance(analyzer.getId(), i, anInstance.getTypes()); //creates another instance                         
                anInstance.markCreated();

                Query query = createInsertQuery(analyzer.getId(), i, anInstance.getTypes());                          

                for (int j = 0; j < anInstance.rowCount(); j++) {
                    insertRow(query, anInstance.getTypes(), anInstance.getRow(j));
                }
                i++;
                System.out.println("i is" + i);
            } else {                            
                createAnInstance(analyzer.getId(), i, anInstance.getTypes());
                anInstance.markCreated();
                Query query = createInsertQuery(analyzer.getId(), i, anInstance.getTypes());
                for (int j = 0; j < anInstance.rowCount(); j++) {
                    insertRow(query, anInstance.getTypes(), anInstance.getRow(j));                                   
                }
                i++;
                System.out.println("i is" + i);
            }
        }
    } catch (Exception ex) {
        Logger.getLogger(AnalyzerService.class.getName()).log(Level.SEVERE, null, ex);
        throw new RuntimeException(ex);
    }
}

5 个答案:

答案 0 :(得分:0)

为什么要在someConditionif中将else设置为true?另外,请检查someCondition是否正在将i的值重置为0或其他内容。不知道someCondition是什么,很难猜测。但如果它是一个以i的值作为参数的函数,我会检查它。

答案 1 :(得分:0)

这段代码是假的 - 包围甚至不排队。如上所述,假设您初始化了size变量,那么这将是有效的,否则大小可能很大(随机整数,如384923492348),它会进行很多迭代。如果你想要一个更好的答案(只是复制粘贴?:)),你能修复代码吗?

答案 2 :(得分:0)

在我看来,dropObject正在改变analyzer.size(),而后者的大小首先是1

答案 3 :(得分:0)

我认为为了获得你给出的输出,必须对方法进行2次单独调用(在上面的代码片段中没有名称)。看来该方法被调用,我被设置为0,循环开始,第一个条件为真。然后循环结束(因为analyzer.size()是1,或者可能是异常???)然后在代码中的其他地方再次调用此方法。再次,我被设置为0,但这次第一个条件是假(第一次调用方法的结果???)所以你改为通过else。循环再次在1次迭代后结束,因为analyzer.size()为1或抛出异常。

答案 4 :(得分:0)

很明显,analyzer.size()正在发生变异。由于我不知道其余的来源,我无法确切知道是什么导致了它。以下列出了可能的罪魁祸首:

  • analyzer.size
  • analyzer.getObject()。得到
  • anInstance.getDatabaseCreated
  • dropObject
  • markCreated
  • analyzer.getId
  • analyzer.getTypes
  • anInstance.getRow
  • anInstance.getTypes
  • 的insertRow

如果您不需要担心在向查询添加行时会发生什么,您可以提前缓存分析器大小,但是您可能遇到麻烦,因为它看起来像你正在删除一些值,同时添加其他值。但是,如果这无关紧要,那就简单了:

int i=0;
int sz = analyzer.size()
while (i < sz) {

另外,我注意到有很多复制和粘贴的代码。糟糕的交易。你的整个while循环可能是:

// you left out the function name!
public void theNamelessOne(Analyzer analyzer){
    try {    
        int i=0;
        while (i < analyzer.size()) {
            System.out.println("i is" + i);
            // the only time you should really use an article ("a", "an", "the" 
            // or equivalent) in a method or vaeriable name is when referencing 
            // "the doctor" or "the wabbit". since there is only one "the doctor"
            // and this is not an Elmer Fudd related instance, you may want to 
            // remove it.
            Object anInstance = analyzer.getObject().get(i);
            if (anInstance.getDatabaseCreated()) { 
                dropObject(analyzer.getId(),i);
            } 
            createAnInstance(analyzer.getId(), i, anInstance.getTypes());
            anInstance.markCreated();
            Query query = createInsertQuery(  analyzer.getId(), 
                                              i, 
                                              anInstance.getTypes());
            for (int j = 0; j < anInstance.rowCount(); j++) {
                insertRow(query, anInstance.getTypes(), anInstance.getRow(j));
            }
            i++;
            System.out.println("i is" + i);
        }
    } catch (Exception ex) {
        Logger.getLogger(
            AnalyzerService.class.getName()
        ).log(Level.SEVERE, null, ex);
        throw new RuntimeException(ex);
    }
}