java - 凯撒加密。73 中的索引 73 中的数组超出范围
问题描述
我正在研究用于数学演示的凯撒加密代码。今天,我一直在为我的演示文稿编写代码。早上,这段代码一直在工作。但是现在在学校,我遇到了一个例外,我认为,我认为这些for
计数超过了我的符号表的长度。
例外:
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 73 在 caesarForm.decrypt(caesarForm.java:81)处超出长度 73 的范围
第 81 行是第 3for
行decrypt()
如果有人可以查看我的代码,我会很高兴,因为我有 3 个月的编码经验,无法理解发生了什么。
//Alphanumeric table
final static char[] symbs = new char[] {'.',',','1','2','3','4','5','6','7','8','9','0','/','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a',' '
,'ß','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','ä','ö','ü','Ü','Ö','Ä'};
final static int charlength = 73;
//var global key
int key = 0;
//en- and decryption vars
char[] letters = new char[255];
char[] storg = new char[255];
char[] sterg = new char[255];
StringBuilder str = new StringBuilder();
int cnt = 0;
int cnt2 = 0;
int c = 0;
String bakToStr;
textField1.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
super.keyTyped(e);
char iNumber = e.getKeyChar();
if (!(Character.isDigit(iNumber))
|| iNumber == KeyEvent.VK_BACK_SPACE
|| iNumber == KeyEvent.VK_DELETE) {
e.consume();
JOptionPane.showMessageDialog(contentPane, "Nur Zahlen werden als schlüssel akzeptiert", "Achtung!", JOptionPane.INFORMATION_MESSAGE);
}
}
});
public String encrypt(String Text) {
letters = new char[255];
storg = new char[255];
sterg = new char[255];
str = new StringBuilder();
cnt = 0;
cnt2 = 1;
c = 0;
bakToStr = "";
for (int i = 0; i <Text.length(); i++) {
letters[i] = Text.charAt(i);
}
for (; cnt < Text.length(); cnt++) {
for (;letters[cnt] != symbs[cnt2];cnt2++) {
}
c = (cnt2 + key) %charlength;
storg[cnt] = symbs[c];
cnt2 = 0;
}
str.append(storg);
bakToStr = String.valueOf(str);
return bakToStr;
}
public String decrypt(String Text) {
letters = new char[255];
storg = new char[255];
sterg = new char[255];
str = new StringBuilder();
cnt = 0;
cnt2 = 1;
c = 0;
bakToStr = "";
for (int i = 0; i <Text.length(); i++) {
letters[i] = Text.charAt(i);
}
for (; cnt < Text.length(); cnt++) {
for (;letters[cnt] != symbs[cnt2];cnt2++) {
}
c = (cnt2 - key) %charlength;
while (c <= 0) {
c += charlength;
}
storg[cnt] = symbs[c];
cnt2 = 0;
}
str.append(storg);
bakToStr = String.valueOf(str);
return bakToStr;
}
解决方案
请考虑这一行:
while (c <= 0) {
c += charlength;
}
如果 会发生什么c==0
?我认为它会跳转到73
which is charlength
。所以,这里更好的方法是创建条件while (c < 0)
而不是while (c <= 0)
.
但是,我认为主要问题在于第三个 for 循环:
for (;letters[cnt] != symbs[cnt2];cnt2++)
因为cnt2
用 value 1
(not 0
) 初始化并递增。如果不满足条件,则 cnt2 将始终递增,因此它变为73
并引发indexOutOfBound
异常。
我希望它有帮助:)
推荐阅读
- swift - Swift IAPManager SKPaymentTransactionObserver 未调用
- swift - 源文件中的 Xcode Editor PlaceHolder
- matlab - 有没有办法在 Matlab 中使用具有不同尺寸元素的表格来操作 K-Nearest-Neighbot 分类?
- java - 在 Spring Data JPA 中的本机查询之间共享 SQL
- java - 使用当前坐标调用 glTranslatef 以恒定速度移动对象(OpenGL ES 1.1)
- asp.net-mvc-5 - 使用 (SqlDataReader reader = cmd.ExecuteReader()) 错误 asp.net mvc5
- xamarin - 编辑 Tizen 清单文件
- r - 如何在R中的许多矩阵列表上平均相同的单元格
- sql - spark数据帧中IFNULL和IFF的等效SQL函数
- swift - 如何使用 UIPanGestureRecognizer 以 180 度角对 CALayer 进行 3Drotate 和 3Dtranslate?