在以下代码中,永远不会执行for循环。我试图用断点和手表解决问题。返回密文的正确长度,但for循环在int i >= ciphertext.length()
之前不会递增。事实上,似乎没有任何东西执行过'Debug'消息。
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 + "%");
}
}
}
答案 0 :(得分:7)
for (int i = ciphertext.length()-1; i>=0; i--){
你需要倒退。另请注意-1
,您需要它来避免超出范围的异常(索引从0
开始并转到length -1
)。
当你被困住时,总是用纸和铅笔大声追踪你的循环,这总是有帮助的。
答案 1 :(得分:3)
for (int i = ciphertext.length()-1; i > 0; i--){
你需要扭转条件,否则逻辑是错误的。
答案 2 :(得分:1)
首先,我强烈建议您学习如何使用IDE的调试器。您还应该学习如何为代码添加System.out.println()
调用以进行调试。
话虽如此,让我们看一下for循环:
for (int i = 0; i>=ciphertext.length(); i--)
假设您已到达for循环,ciphertext
的长度为10. i
初始化为零。然后条件检查它是否大于或等于10.没有它,所以整个for循环被跳过。
请注意,for循环的条件必须为true才能继续循环。 不用于告诉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++)
答案 3 :(得分:0)
i>=ciphertext.length()
应该是
i < ciphertext.length()