toCharArray,Index out of bounds

时间:2015-08-04 16:19:03

标签: java indexoutofboundsexception

有人可以告诉我为什么.toCharArray()行会给出Index Out of Bounds异常吗?为什么它甚至为String提供索引0大小0异常?我还没有定义一个字符串数组?!

此外,此代码应该在O(n)时间运行吗?

import java.util.ArrayList;
import java.util.List;


public class FirstNonRepeating {


public static List<Character> list = new ArrayList<Character>();
public static List<Character> list2 = new ArrayList<Character>();

public static String res(String x) {
    char[] y = x.toCharArray();

    for(char c:y){
        list2.add(c);
        if(list.contains(c)){
            list2.remove(c);
        }
        else{
            list2.add(c);
        }
    }

    if(list2.isEmpty()){
    return "NONE";
    }

    else return (""+list.get(0));

    }

public static void main(String[] args) {

    String a="Google";
    String z=res(a);
    System.out.println(z);
}

}

5 个答案:

答案 0 :(得分:5)

你的例外就在这里:

        if (list2.isEmpty()) {
            return "NONE";
        } else return ("" + list.get(0));

检查空虚list2并尝试从list获取第一个元素,该元素似乎为空,并抛出异常。将其更改为:

... else return ("" + list2.get(0));

答案 1 :(得分:1)

我看到有两个列表:listlist2。在for循环中,您只添加了元素list2,每个元素两次!所以list2 bocomes

  

[G,G,o,o,o,o,g,g,l,l,e,e]

for(char c:y){
    list2.add(c); // added first time into list2
    if(list.contains(c)){ // false, as list is empty
        list2.remove(c); // never executed
    }
    else{
        list2.add(c); // added same char second time into list2
    }
}

list仍为空。因此list.get(0)产生了

  

java.lang.IndexOutOfBoundsException:Index:0,Size:0

排队,

else return (""+list.get(0));
  

此代码应该在O(n)时间运行吗?

是的。 for循环将迭代到输入字符串a.length大小。

答案 2 :(得分:0)

异常不是因为.toCharArray()。这是因为你正在检查if(list.contains(c))的条件,因为你在这个list对象中没有任何值。行char[] y = x.toCharArray();显示异常,因为它是JRE最后一次正确执行的行的语句。

在进行任何条件检查之前尝试初始化list对象。我想这将解决问题。

答案 3 :(得分:0)

错误不在date_default_timezone_get()方法上。

因为你的.toCharArray()是空的。因为您的代码永远不会添加任何元素。

此外,您正在检查list是否为空状态。

list2

但是在if(list2.isEmpty()) 部分,您尝试从else获取,这实际上是空的。

因此错误:索引超出界限异常

答案 4 :(得分:0)

与其他人上面说的一样,原来的问题是由于你试图访问一个空列表。我认为您可能想要尝试做的是重新考虑您对问题的解决方案,并且您可以避免一些这些陷阱。

您的代码可以简化一点。我想你想要这样的东西。

public class FirstNonRepeating {

    public static String res(String string) {

        char [] characters = string.toCharArray();
        boolean repeat = false;
        char last = characters[0];
        int length = characters.length; 

       for (int x  = 0; x < length - 1; x++){
          if(characters[x] != characters[x + 1]){

                if(x == 0) return Character.toString(characters[x]);

                if(characters[x] != last) return Character.toString(characters[x]);

            }

          last = characters[x];
       }

       return (last != characters[length - 1] ? Character.toString(characters[length - 1]) : "");
    }



    public static void main(String[] args) {

        String a = "Google";
        System.out.println(res(a));

        a = "oobgle";
        System.out.println(res(a));

        a = "oooooe";
        System.out.println(res(a));

    }
}