Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何修复超出范围的字符串索引:-1_Java_String - Fatal编程技术网

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

Java 如何修复超出范围的字符串索引:-1,java,string,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(p

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

索引超出范围异常值-1表示未找到请求的符号,在本例中为S。

索引超出范围异常值-1表示未找到请求的符号,在本例中为S。

在字符串上使用
短语.indexOf('S')
,而不检查返回值。如果没有匹配项,则该方法返回
-1
。然后使用此索引作为子字符串的上限,这会使程序崩溃


如果我正确地理解了你想做的事情,即使你做得正确,你也会想要一个不同的算法。没有理由在字符串中搜索所需字符的每个匹配项,也没有理由编写一个循环,将长度递减1。另外,尽可能避免复制长数组和字符串。

在字符串上使用
短语.indexOf('S')
,而不检查返回值。如果没有匹配项,则该方法返回
-1
。然后使用此索引作为子字符串的上限,这会使程序崩溃

如果我正确地理解了你想做的事情,即使你做得正确,你也会想要一个不同的算法。没有理由在字符串中搜索所需字符的每个匹配项,也没有理由编写一个循环,将长度递减1。此外,如果可能,请避免复制长数组和字符串

我不确定这样做是否正确。然而,我发现添加if语句实际上修复了这段代码,并在索引变为-1时停止for循环

我不确定这样做是否正确。然而,我发现添加if语句实际上修复了这段代码,并在索引变为-1时停止for循环


当子字符串中没有
S
时,
phrase.indexOf('S')
返回什么?索引越界异常是由一个原因引起的,即使用的索引超出了正在迭代的列表/数组/集合的界限。使用调试器找出代码超出限制的位置(低于有效的起始索引或高于最大索引)。如果(sKey!=-1)在更改存储之前将修复您的问题
短语有什么作用。当子字符串中没有
S
时,indexOf('S')
返回?索引越界异常是由一件事引起的,它使用的索引超出了正在迭代的列表/数组/集合的范围。使用调试器找出代码超出限制的位置(低于有效起始索引或高于最大索引)。如果(sKey!=-1)在更改存储将修复您的问题之前,请确认您一直在调试器中看到这种情况,但一小时后,我想到制作一条if语句来捕获这种情况以防止错误。感谢您一直在调试器中看到这种情况,但一小时后,我想到制作一条if语句来捕获这种情况以防止错误。
    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;
            }
    }```