有人能告诉我为啥这个方法会进入无限循环吗?

Posted

技术标签:

【中文标题】有人能告诉我为啥这个方法会进入无限循环吗?【英文标题】:Can someone tell me why this method is going into an infinite loop?有人能告诉我为什么这个方法会进入无限循环吗? 【发布时间】:2016-03-03 12:05:47 【问题描述】:

因此,如果 if(printLibraryNumber.equals(borrowersArray[index].getLibraryNumber() 语句为真,我不知道为什么,那么这个方法似乎会进入无限循环。

public boolean printBorrower(String printLibraryNumber)

   int index = 0;
   boolean isPrinted = false;
   while(index < currentIndex)
   
       if(printLibraryNumber.equals(borrowersArray[index].getLibraryNumber()))
       
           borrowersArray[index].printBorrowerDetails();
           isPrinted = true;
       
       else
       
           index++;
           isPrinted = false;
       
   

   if(isPrinted == false)
   
       System.out.println("Borrower with library number " + printLibraryNumber + " not found.");
    

   return isPrinted;

【问题讨论】:

【参考方案1】:

紧接着:

isPrinted = true;

添加

return isPrinted;

我认为应该这样做。祝你好运!

【讨论】:

【参考方案2】:

这是你的循环条件:

while(index < currentIndex)

如果这是真的:

printLibraryNumber.equals(borrowersArray[index].getLibraryNumber())

然后你这样做:

borrowersArray[index].printBorrowerDetails();
isPrinted = true;

这意味着indexcurrentIndex 都没有被修改。所以你的循环条件仍然成立。它将继续是真的。

为了退出循环,循环条件在某些时候需要为假,或者您需要使用returnbreak 语句。 (或者,好吧,抛出异常或以某种方式导致系统失败。但这有点激烈。)

【讨论】:

【参考方案3】:

因为,当if(printLibraryNumber.equals(borrowersArray[index].getLibraryNumber()))true 时,您不会更改index。因此,它会在下一次循环迭代中测试相同的索引。哪里是真的。因此是一个无限循环。我想你想要类似的东西,

int index = 0;
while (index < currentIndex) 
    if (printLibraryNumber.equals(borrowersArray[index].getLibraryNumber())) 
        borrowersArray[index].printBorrowerDetails();
        return true;
    
    index++;

System.out.printf("Borrower with library number %s not found.%n", printLibraryNumber);
return false;

【讨论】:

所以现在我有了这个; gist.github.com/anonymous/516ac35d783e947a5abb 但还是会死循环? 当条件为 true 时,您仍然没有更改 index【参考方案4】:

自从

if(printLibraryNumber.equals(borrowersArray[index].getLibraryNumber()))

statement 总是trueif 代码块会被执行,而 else 块不会。而且由于您没有更改 if 块中的 index 变量,因此您会进入 无限循环,因为它是 index 变量将决定何时停下来。

您需要在任何条件代码块的外部增加index变量:

while(index < currentIndex)

    if(printLibraryNumber.equals(borrowersArray[index].getLibraryNumber()))
    
         borrowersArray[index].printBorrowerDetails();
         isPrinted = true;
    
    else
    
         isPrinted = false;
    

    index++; // increment here

【讨论】:

以上是关于有人能告诉我为啥这个方法会进入无限循环吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码会进入无限循环? [复制]

为啥我在 React JS 中的代码会进入满足这两个条件的无限循环?

从代码中删除警报会强制其进入无限循环

为啥我的代码在执行时的初始嵌套 for 循环中进入无限循环?

为啥这个回调会产生无限循环

为啥`#!/usr/bin/env var=val command`会进入无限循环