如何修复索引超出范围错误?

时间:2015-10-02 12:41:59

标签: java runtime-error

我是初学者java程序员,我正在尝试制作一个程序,按字母顺序对字符串进行排序,这段代码很乱,但是当它消除了一半的字符串时,我收到索引错误的范围。我确信这是由于我正在增加并且l正在减少但我不确定修复,帮助将被赞赏,并且我不被允许使用sort函数。

import java.util.Scanner;
import java.util.ArrayList;

public class Question6{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter a string");
        String user = in.nextLine();
    int l = user.length();
    //System.out.println(l);
    int i = 0;
    System.out.println("Length is " + user.length());
    ArrayList<Character> chars = new ArrayList<Character>();
    //System.out.println(first);
    while (l > 0){
        char first = user.charAt(0);
        ArrayList<Character> earliest = new ArrayList<Character>();
        earliest.add(first);
        char char1 = user.charAt(i);
        if (char1 <= earliest.get(0)){
            earliest.remove(0);
            earliest.add(char1);
            user = user.substring(0, i) + user.substring(i+1);
            chars.add(char1);
            System.out.println("earliest in loop " + earliest.toString());
            System.out.println("chars in loop " + chars.toString());
            System.out.println("string is now " + user);
            System.out.println(" ");
            i = i+1;
            }
        else{
            chars.add(first);
            System.out.println("chars in else " + chars.toString());
            i = 0;
        }
        l = user.length();
    }

    System.out.println("done ");        
}
}

错误是

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 3
    at java.lang.String.charAt(Unknown Source)
    at Question6.main.(Question6.java:19)

这是字符串“Stack”作为输入

3 个答案:

答案 0 :(得分:1)

java.lang.String实施java.lang.Comparable,所以您可以这样做:

if (s1.compareTo(s2) < 0) {
    //...
} else if (s1.compareTo(s2) == 0) {
    //...
} else {
    // ...
}

此外,请避免在循环使用remove(int)时使用Collection,更喜欢使用Iterator这样的内容:

Iterator<String> ite = myListString.iterator();
String str;
while(ite.hasNext()) {
     str = ite.next();
     if (/* this entry has to be removed from the list */) {
          ite.remove();
     }
}

答案 1 :(得分:1)

这是因为您在

处对用户字符串进行了子串
    user = user.substring(0, i) + user.substring(i + 1);

并且在while循环中

中的 i(递增变量)
 char char1 = user.charAt(i); 

大于字符串用户的长度,并且它尝试访问String用户中不存在的位置的变量,然后它将抛出ArrayIndexOutOfBondException。

例如你的字符串是&#34;一个&#34;在2次迭代之后,字符串将是e,你的i将是2 所以char char1 = user.charAt(i);会尝试访问它 char char1 =&#34; e&#34; .charAt(2); (不存在)

我建议改变你的逻辑

答案 2 :(得分:0)

您正在迭代l,这是用户提供的输入字符串的长度。在每次迭代中,您将i加1。在迭代中,您正在访问输入字符串的索引i。除非你陷入其他情况,否则字符串的长度保持不变。因此,i迟早会大于l - 1,而位置l会在数组中没有索引。

此外,正如其他人已经指出的那样,还有其他一些问题。

尝试查看各种排序算法,例如http://www.sorting-algorithms.com/