java中索引超出范围的异常

时间:2013-12-30 18:25:35

标签: java arrays exception

异常消息:

Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 2

以下是我用来突出显示JTextPane中特定字词的代码。我的目标是创建一个简单的语法高亮编辑器,我已经彻底搜索了它并找到了许多有趣的解决方案,但我想为它编写自己的代码,现在我被困在IndexOutOfBoundsException

我的编辑器会在按下第三个键时发出此异常,这意味着只要在JTextPane中写入2个字母。

如果代码不容易理解,我很抱歉,我是学习惯例的新手。

我知道这是一个非常微不足道的问题,但任何形式的帮助都是相当大的。 谢谢:))

[更新]代码的第一部分适用于jTextPane2KeyTyped事件

    String[] words = new String[] {"if","else","for"};
    //words is the list for words to change color

    StyledDocument doc = jTextPane2.getStyledDocument();

    Style style=doc.addStyle("Red_Colour", null);
    StyleConstants.setForeground(style, Color.RED);
    StyleConstants.setForeground(common,Color.BLACK);

    String temp = jTextPane2.getText();
    //temp holds the string value of the text present in the jTextPane2

    int check=0;

    for(int i=0;i<temp.length();i++){
        for(int j=0;j<words.length;j++){
            if(charLeft(temp,words,i,j)){
                if(temp.length()>=words[j].length())
                    for(int k=0;k<words[j].length();k++){
                        if(temp.charAt(i+k)==words[j].charAt(k))check++;
                    }
                    //else{break;}
                    if(check==words[j].length()){
                        doc.setCharacterAttributes(i,words[j].length(),style, false);
                    }
            }
        }
    }

以下是名为(即charLeft()

的方法的代码
   public Boolean charLeft(String temp,String[] words,int i,int j){

    temp= temp.substring(i, temp.length());
    if(temp.length()<words[j].length())return true;
    else return false;
} 

TrackBack用于例外

    Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
at java.lang.String.charAt(String.java:658)
at NewJFrame.jTextPane2KeyTyped(NewJFrame.java:164)
at NewJFrame.access$000(NewJFrame.java:24)
at NewJFrame$1.keyTyped(NewJFrame.java:59)
at java.awt.Component.processKeyEvent(Component.java:6460)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2828)
at java.awt.Component.processEvent(Component.java:6282)
    ...

    Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException: String index out of range: 2
at java.lang.String.charAt(String.java:658)
at NewJFrame.jTextPane2KeyTyped(NewJFrame.java:164)
at NewJFrame.access$000(NewJFrame.java:24)
at NewJFrame$1.keyTyped(NewJFrame.java:59)
at java.awt.Component.processKeyEvent(Component.java:6460)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2828)
    ...

3 个答案:

答案 0 :(得分:5)

你实际上在第三个循环中增加了j,而不是k

if(temp.length()>=words[j].length())for(int k=0;k<words[j].length();j++)

自发猜测是你应该把它改成以下,以避免超过最大长度:

if(temp.length()>=words[j].length())for(int k=0;k<words[j].length();k++)

答案 1 :(得分:2)

我认为这一行可能是您的问题(这是您发布的第二个代码块的第3行):

    if(temp.length()>=words[j].length())for(int k=0;k<words[j].length();j++){if(temp.charAt(i+k)==words[j].charAt(k))check++;}

你实际上在这里增加了j而不是k:

    for(int k=0;k<words[j].length();j++)

因为当你输入第三个字符时,j对应于words.length(即3),它会尝试引用不存在的字[3]。我建议将其更改为:

    for(int k=0;k<words[j].length();k++)

希望有所帮助。

修改

现在我想的是,而不是说:

    if(temp.charAt(i+k)==words[j].charAt(k))check++;

您可能想说:

    if(temp.charAt(i)==words[j].charAt(k))check++;

答案 2 :(得分:0)

固定!问题是我没有将计数值改回零。其他问题出在charLeft()的条件运算符中,即

if(temp.length()<words[j].length())return true;

更正条件

if(temp.length()>=words[j].length())return true;