如何修复字符串索引超出范围:-1

时间:2019-10-24 23:05:02

标签: java string

我一直在研究一种生成密码的方法,该方法会将每个“ 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)

3 个答案:

答案 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;
            }
    }```