【问题标题】:Using for loop incorrectly错误地使用 for 循环
【发布时间】:2013-01-29 00:02:28
【问题描述】:

在以下代码中,永远不会执行 for 循环。我试图解决断点和手表的问题。返回密文的正确长度,但是 for 循环直到 int i >= ciphertext.length() 才增加。事实上,在“调试”消息之后似乎没有执行任何操作。

private void decrypt_btnActionPerformed(java.awt.event.ActionEvent evt) {                                            


    String alphabet= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    String ciphertext="fRcXFBxXTRJ";


    status_label.setText( "Decryption has begun" );

    JOptionPane.showMessageDialog(null,"ciphertext-length: " + ciphertext.length() + "\n" + ciphertext,"Debug", JOptionPane.INFORMATION_MESSAGE);

    for (int i = 0; i>=ciphertext.length(); i--){

        System.out.println("inc:" + i);

        String cipher_current_char = getLetterAtIndex(ciphertext, i);
        int pos_char_in_alphabet = getIndexAtLetter(alphabet, cipher_current_char);


        if(pos_char_in_alphabet-2<0){

            plain_ta.setText(getLetterAtIndex(alphabet, (alphabet.length()+(pos_char_in_alphabet -2)+1 ) ));

            status_label.setText( 100/i + "%");



        }else{

            cipher_current_char = getLetterAtIndex(ciphertext, i);

            pos_char_in_alphabet = getIndexAtLetter(alphabet, cipher_current_char);

            plain_ta.setText(getLetterAtIndex(alphabet, (pos_char_in_alphabet-2)));

            status_label.setText( 100/i + "%");

        }
    }
}                          

【问题讨论】:

  • 学习使用调试器。 :-) 有一次在if 语句上设置断点并检查它被命中时的值就可以解释你遇到的问题。

标签: java string loops for-loop


【解决方案1】:
for (int i = ciphertext.length()-1; i>=0; i--){

您需要向后工作。还要注意-1,您需要它来避免越界异常(索引从0 开始并转到length -1)。

当你遇到困难时,总是用纸和铅笔大声地追踪你的循环,这总是有帮助的。

【讨论】:

  • 不应该,检查发生在实际执行循环的其余部分并递减之前。如:是 i>= 0?是的,执行循环体,递减i,再次检查等
  • 哦,是的,我忘记了.. kwl
【解决方案2】:
for (int i = ciphertext.length()-1; i > 0; i--){

你需要反转条件,否则逻辑错误..

【讨论】:

  • 你已经过时了; length() 已经结束了。
【解决方案3】:

首先,我强烈建议您学习如何使用 IDE 的调试器。您还应该了解如何将 System.out.println() 调用添加到您的代码中以进行调试。

话虽如此,让我们看看for循环:

for (int i = 0; i>=ciphertext.length(); i--)

假设您已到达 for 循环,ciphertext 的长度为 10。i 被初始化为零。然后条件检查它是否大于或等于10。不,不是,所以整个for循环被跳过。

请注意,for 循环的条件必须为真,循环才能继续。它用于告诉for循环何时停止。

所以我们可以解决这个问题:

for (int i = 0; i<=ciphertext.length(); i--)

现在 for 循环以 i 在 0 开始。这小于或等于 10,因此循环执行。 i 递减为 -1,再次小于或等于 10。执行循环,i 递减为 -2...

我在这里看到了一个模式。循环不会停止。我们需要做出另一个改变:

for (int i = 0; i<=ciphertext.length(); i++)

现在i 从 0 增加到 10。但是,当 i 为 10 时,你会得到一个异常。这是因为唯一有效的索引是从 0 到 9。最后一个修复将改变问题:

for (int i = 0; i<ciphertext.length(); i++)

【讨论】:

    【解决方案4】:
    i>=ciphertext.length()
    

    应该是

    i < ciphertext.length()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2011-11-29
      相关资源
      最近更新 更多