我一直在研究一种生成密码的方法,该方法会将每个“ S”都更改为$。
请注意,我是从另一个班级学来的短语,它将始终大于8个字符
String key;
String store;
key = phrase.substring(0,1).toUpperCase();
phrase = key + phrase.substring(1,phrase.length());
System.out.println(phrase);
System.out.println(phrase.length());
for(int i = phrase.length(); i>0; i--) {
int sKey = phrase.indexOf('S');
store = "$" + phrase.substring(sKey+1,phrase.length());
phrase =phrase.substring(0,sKey)+store;
System.out.print(phrase);
}
}
但是我以后总是会收到此错误
Exception in thread "main" Te$taaaajava.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at edu.ilstu.Security.generatePassword(Security.java:15)
at edu.ilstu.SecurityApp.main(SecurityApp.java:57)
答案 0 :(得分:2)
索引超出范围异常值-1表示找不到请求的符号,在这种情况下为S。
答案 1 :(得分:1)
您对字符串使用phrase.indexOf('S')
而不检查返回值。如果没有匹配项,则该方法返回-1
。然后,您将此索引用作子字符串的上限,这会使程序崩溃。
即使我正确理解了您要执行的操作,即使您的算法正确,也将需要其他算法。没有理由既要搜索字符串来查找所需的每次出现的字符,也没有理由编写一个将长度减1的循环。此外,请尽可能避免复制长数组和字符串。
答案 2 :(得分:0)
我不确定这是否是正确的方法。但是,我发现添加一个if语句实际上可以修复此代码,并在索引变为-1时停止for循环
String key;
String store;
key = phrase.substring(0,1).toUpperCase();
phrase = key + phrase.substring(1,phrase.length());
for(int i = phrase.length(); i>0; i--) {
int sKey = phrase.indexOf('S');
if(sKey >= 0) {
store = "$" + phrase.substring(sKey+1,phrase.length());
phrase =phrase.substring(0,sKey)+store;
}else {
i=0;
}
}```