我有一个像这样的简单代码:
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);
}
}
答案 0 :(得分:0)
为什么要在someCondition
和if
中将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()
正在发生变异。由于我不知道其余的来源,我无法确切知道是什么导致了它。以下列出了可能的罪魁祸首:
如果您不需要担心在向查询添加行时会发生什么,您可以提前缓存分析器大小,但是您可能遇到麻烦,因为它看起来像你正在删除一些值,同时添加其他值。但是,如果这无关紧要,那就简单了:
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);
}
}