【问题标题】:StringIndexOutOfBoundsException, delete whitespaces from a string methodStringIndexOutOfBoundsException,从字符串方法中删除空格
【发布时间】:2012-02-02 04:35:38
【问题描述】:

我正在使用 java 作为我的主人的作业来制作一个密码学/密码分析程序。无论如何,我使用一种方法来删除无用的空格并使我正确显示到 JTextArea 的字符串。这种方法非常适合小文本,但是当我使用更大的文本(从 .txt 文件加载)时,它会给我一个 StringIndexOutOfBoundsException。任何人都可以帮忙吗? 提前致谢。

这是方法:

public void Data(String s) {
    System.out.print("Analysis" + "\n" + s);
    jTextArea1.setText(s);
    StringBuilder buf = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        if (!Character.isWhitespace(s.charAt(i))) {
            buf.append(s.charAt(i));
        } else if (Character.isWhitespace(s.charAt(i)) &&   !Character.isWhitespace(s.charAt(i + 1))) {
            buf.append(s.charAt(i));
        }
    }
    System.out.println(buf.toString() + "\n" + "from buf");
    jTextArea1.setText(buf.toString());
}

【问题讨论】:

  • 你读过s.charAt(i + 1),所以如果字符串中的最后一个字符是空格,你会得到越界错误。如果i + 1 == s.length(),您将无法读取s.charAt(i + 1),在这种情况下会读取。

标签: java string swing stringbuilder


【解决方案1】:

您将在 for 循环中上升到 s.length(),但在第二个 if 语句中访问 s.charAt(i + 1)。尽量只上s.length() - 1

for (int i = 0; i < s.length() - 1; i++) {
    if (!Character.isWhitespace(s.charAt(i))) {
        buf.append(s.charAt(i));
    } else if (Character.isWhitespace(s.charAt(i)) &&   !Character.isWhitespace(s.charAt(i + 1))) {
        buf.append(s.charAt(i));
    }
}

然后检查最后一个字符。

【讨论】:

  • 只是字符串最后一个字符丢失的问题。 :S
  • 我手动添加最后一个字符。含义:buf.append(s.charAt(s.length() - 1));
【解决方案2】:

s.charAt(i + 1)!Character.isWhitespace(s.charAt(i + 1))

i == s.length() - 1 失败

您可能希望使用s.replaceAll("\\s\\s+"," ") 而不是重新发明轮子。

【讨论】:

  • 感谢您的回答。
  • 原始字符串中的“\\s+”就足够了。我可能还会修剪字符串以消除单个前导和尾随空格。
  • @JuhaLaiho:是的。但它可能会更广泛,因为必须替换更多字符串:您还必须将一个空格替换为另一个空格字符串。 jvm/编译器可能会对其进行优化并忽略这些情况-但我完全不确定是否是这种情况。
【解决方案3】:

你正在使用这个语句

Character.isWhitespace(s.charAt(i + 1)

表示您正在访问字符串长度加 1 的字符。

【讨论】:

    【解决方案4】:
    hi i hope you can use the below one, instead the above
    
    //StringBuilder buf = new StringBuilder();
    /*  These lines are not needed 
       for (int i = 0; i < s.length(); i++) {
            if (!Character.isWhitespace(s.charAt(i))) {
                buf.append(s.charAt(i));
            } else if (Character.isWhitespace(s.charAt(i)) &&   !Character.isWhitespace(s.charAt(i + 1))) {
                buf.append(s.charAt(i));
            }`enter code here`
        }
    */
    s = s.replaceAll("\\s+"," ");
    // Whenever you print the object(reference) toString() method is called by default. so no need to call explicitly
    //    System.out.println(buf.toString() + "\n" + "from s");
        System.out.println(s + "\n" + "from buf");
    //    jTextArea1.setText(s);
        jTextArea1.setText(s);
    

    【讨论】:

    • 这是一个解决方案。但我想我会放弃 \n 字符。
    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 2011-09-21
    • 2017-11-20
    • 2015-09-22
    相关资源
    最近更新 更多