为什么会出现超出范围的异常错误?

时间:2019-11-30 11:48:23

标签: java error-handling

我目前正在一个项目上,我终于完成了编写代码的工作,但是由于某种原因,我遇到了很多错误,而且不确定它们在哪里。我知道在这里发布整个代码是不满意的,我正在使用Java,因此很难在Java上发现错误。我的项目合作伙伴从来没有帮助过。我是唯一担负重担的人。

这是我的代码

 public class Main {

    public static int Statement_Number = 1;
    public static String Current_Statement;
    public static int i = 0; //Index for Script
    public static int j = 0; //Index for Statements
    public static String Missing_Word; 
    public static ArrayList<String> Letters_of_the_missing_word = new ArrayList<String>();
    public static char WhiteSpace = ' '; 
    public static String Movie_Script; 
    public static char Missing_Word_Characters[] = new char[20]; 


    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        int count = 0; 
        int length = 0; //Length to compute LPS 
        char Underscore = '_'; 

        ArrayList<String> Statements_List = new ArrayList<String>();



        boolean word_missing = false; 
        BufferedReader Statements = new BufferedReader(new FileReader("C:\\Users\\hasan\\Desktop\\Programming\\Java Programs\\Analysis of Algorithms Project\\term_project\\statements.txt"));
        BufferedReader Script = new BufferedReader(new FileReader("C:\\Users\\hasan\\Desktop\\Programming\\Java Programs\\Analysis of Algorithms Project\\term_project\\the_truman_show_script.txt"));
        Movie_Script = Script.readLine();  
        int Script_Length = Movie_Script.length(); 
        //System.out.println(Script_Length);  //81,902



        //System.out.println(Movie_Script); 

        while((Current_Statement = Statements.readLine()) != null)
        {
            Statements_List.add(Current_Statement);
            int Current_Statement_length = Current_Statement.length(); 

            for(Statement_Number = 0; Statement_Number < 6; Statement_Number++)
            {
                //System.out.println(Statements_List.get(i));
                Current_Statement = Statements_List.get(Statement_Number); 
                System.out.println(Statement_Number + ". " + Current_Statement);
                KMPSearch(Current_Statement, Movie_Script); 
            }
        }


}

    static void KMPSearch(String Current_Statement, String Movie_Script)
    {
        int Current_Statement_Length = Current_Statement.length(); 
        int Movie_Script_Length = Movie_Script.length(); 
        int lps[] = new int[Current_Statement_Length];
        int j = 0; //Index for Current_Statement
        char Underscore = '_';

        Calculating_LPS_Array(Current_Statement, Current_Statement_Length, lps);

        int i = 0; 
        while(i < Movie_Script_Length)
        {
            if(Current_Statement.charAt(j) == Movie_Script.charAt(i))
            {
                i++; 
                j++; 
            }
            else if(Current_Statement.charAt(j) != Movie_Script.charAt(i) && Current_Statement.charAt(j) == Underscore)
            {
                //Replace the underscores with the word
                Word_Getter(); 
                String New_Statement = Current_Statement.replaceAll("___", Missing_Word); 
                System.out.println(New_Statement);
                System.out.println(""); 
            }
            else if(i < Movie_Script_Length && Current_Statement.charAt(j) != Movie_Script.charAt(i))
            {
                if(j != 0)
                {
                    j = lps[j - 1]; 
                }
                else 
                {
                    i = i + 1; 
                }
            }
        }

        if(i == Movie_Script_Length)
        {
            System.out.println("STATEMENT NOT FOUND"); 
        }
    }

    static void Calculating_LPS_Array(String Current_Statement, int Current_Statement_Length, int lps[])
    {
        int len = 0; 
        int i = 1; 
        lps[0] = 0; 
        while(i < Current_Statement_Length)
        {
            if(Current_Statement.charAt(i) == Current_Statement.charAt(len))
            {
                len++; 
                lps[i] = len; 
                i++; 
            }
        else    //Current_Statement.charAt(i) != Current_Statement.charAt(len)
            {
                if(len != 0)
                {
                    len = lps[len - 1]; 
                }
                else
                {
                    lps[i] = len; 
                    i++; 
                }

            }
        }
    }

    static void Word_Getter()
    {
        if(Movie_Script.charAt(j) != WhiteSpace)
        {
            Movie_Script.getChars(j, WhiteSpace, Missing_Word_Characters, 0);
            j++; 
            Missing_Word = new String(Missing_Word_Characters); 
        }

    }

}

这是我遇到的错误

  

线程“主”中的异常java.lang.StringIndexOutOfBoundsException:   偏移量0,计数32,长度20   java.base / java.lang.String.checkBoundsOffCount(String.java:3304)在   java.base / java.lang.String.getChars(String.java:855)在   位于Main.KMPSearch(Main.java:85)处的Main.Word_Getter(Main.java:142)   Main.main(Main.java:57)

非常感谢您的帮助,在此先感谢您。

1 个答案:

答案 0 :(得分:1)

您只需要更改Array的大小即可:

public static char Missing_Word_Characters[] = new char[32]; 
相关问题