Застрял в петле времени - PullRequest
0 голосов
/ 25 июля 2011

У меня есть простой код, подобный следующему:

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 голосов
/ 26 июля 2011

Очевидно, что 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);
    }
}
0 голосов
/ 25 июля 2011

Я думаю, что для получения результата, который вы дали, необходимо сделать 2 отдельных вызова метода (который в приведенном выше фрагменте кода не имеет имени). Кажется, что метод вызывается, я установлен в 0, цикл начинается, и первое условие истинно. Затем цикл заканчивается (потому что analyzer.size () равен 1, или, может быть, исключением ???), а затем где-то еще в вашем коде вы снова вызываете этот метод. Опять же, я установлен в 0, но на этот раз первое условие ложно (результат первого вызова метода ???), поэтому вместо этого вы проходите через else. И снова цикл завершается после 1 итерации, либо потому что analyzer.size () равен 1, либо выдается исключение).

0 голосов
/ 25 июля 2011

Этот код поддельный - брекетинг не совпадает даже. Как написано, это будет работать, если вы инициализируете переменную размера, в противном случае размер может быть огромным (случайное целое число, например 384923492348), и он будет выполнять много итераций. Можете ли вы исправить код, если хотите получить лучший ответ (просто скопируйте и вставьте? :))

0 голосов
/ 25 июля 2011

Мне кажется, что dropObject меняет analyzer.size() и что размер последнего был 1 в первую очередь.

0 голосов
/ 25 июля 2011

Почему вы устанавливаете для someCondition значение true в if и else?Также проверьте, сбрасывает ли someCondition значение i в 0 или что-то еще.Не зная, что такое someCondition, трудно догадаться.Но если это функция, принимающая значение i в качестве параметра, я проверю это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...