使用charat()循环时的StringIndexOutOfBoundsException

时间:2014-08-27 02:33:00

标签: java exception while-loop char stack

在stackoverflow和其他论坛中寻找解决方案一小时后,我放弃了。

你知道我为什么会得到例外吗?

    public Stack<Character> einlesen(){
    Scanner sc = new Scanner(System.in);
    Stack<Character> st = new Stack<>();
    System.out.println("Please insert any random text: \n");

    DataInputStream is = new DataInputStream(System.in);

        try {
            String eingabe;

            eingabe = is.readLine();

            int i = 0;
            while (eingabe.charAt(i) != -1  ) {
                st.push(eingabe.charAt(i));
                i++;
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return st;

编辑:

感谢Elliot的完美工作。

如果我想以相反的顺序重写堆栈中的所有字符,我尝试使用以下代码。但它只写了几个字。当我使用peek函数时,它给了我所有这些。

所以我觉得“我有点错误”

    for ( int i =0; i<st.size();i++) {
        System.out.print(st.pop().toString());
    }

5 个答案:

答案 0 :(得分:2)

  

你知道我为什么会得到例外吗?

是啊......

您的eingabe字符串不可能包含等于-1的字符。 (即使字符0xffff将转换为整数65535。)所以你的while循环只是索引字符串的结尾。

(无论如何,Java字符串都不会被任何特定字符终止。Java ain C = C ++。)

使用eingabe.length()告诉您何时停止...


  

在stackoverflow和其他论坛中寻找解决方案一小时后,我放弃了。

这里有一些免费的建议:

您正在做的不是解决程序问题的正确方法。正确的编程方法是根据您对Java语言和类库的了解来阅读和理解您的代码。如果你还没有这方面的知识......

  1. 执行Oracle Java教程,或购买和阅读优秀的初学者Java教科书。

  2. 阅读您尝试使用的类的javadoc。

  3. 谷歌搜索简单编程问题的解决方案可能是浪费时间。你不会学到很多东西,你很有可能会找到不正确或不恰当的解决方案,和/或当你看到它们时,你不会认识到正确的解决方案。

答案 1 :(得分:1)

你需要使用for循环。

        String eingabe;

        eingabe = is.readLine();

        for( int i = 0; i < eingabe.length(); i++ ) {
            st.push(eingabe.charAt(i));
        }

答案 2 :(得分:1)

Java不是C(即使它是-1,也不是'\ 0'),这个

while (eingabe.charAt(i) != -1  ) {
  st.push(eingabe.charAt(i));
  i++;
}

应该是

while (i < eingabe.length()) {
  st.push(eingabe.charAt(i));
  i++;
}

,或者

for (char ch : eingabe.toCharArray()) {
  st.push(ch);
}

因为Java String没有String字符的结尾。

答案 3 :(得分:1)

对于charAt,索引i必须介于0和字符串长度减1(包括两端)之间。当i等于length()时,您会得到索引超出约束的异常。

这是the document for String charAt

以下是解决此问题的一种方法:

while (i < eingabe.length()) {
    ....
}

答案 4 :(得分:0)

这是你的第二个问题的答案: 是的,问题出在for循环中,用于从堆栈中检索元素。您不应该操纵数据结构,尤其是在根据大小进行迭代时。 for循环中的代码片段从堆栈中删除一个元素(这意味着大小减少了1)并且循环变量增加1.这就是为什么只获得一半数据的原因。 / p>

我希望下面的代码能够提供帮助。

Stack<Character> stack = new Stack<Character>(); 
String name = "Loganathan";

for (char c : name.toCharArray()) {
    stack.push(c);
}

StringBuffer buff = new StringBuffer();
while (! stack.isEmpty()) {
    buff.append(stack.pop());
}

System.out.println("Retrieved from the stack : " + buff.toString());